Awk 比较特定列的两行中的值
我想根据前一行的条件打印文件行。我想实施以下条件: 如果当前行和上一行之间的键(字段1和字段2)相同,且上一行的字段8和字段8之间的差值大于1,则打印当前行并追加差值 输入文件:Awk 比较特定列的两行中的值,awk,Awk,我想根据前一行的条件打印文件行。我想实施以下条件: 如果当前行和上一行之间的键(字段1和字段2)相同,且上一行的字段8和字段8之间的差值大于1,则打印当前行并追加差值 输入文件: 47329,39785,2,12,10,351912.50,2533105.56,170.93,1 47329,39785,3,6,7,351912.82,2533105.07,170.89,1 47329,39785,2,12,28,351912.53,2533118.81,172.91,1 47329,39785,
47329,39785,2,12,10,351912.50,2533105.56,170.93,1
47329,39785,3,6,7,351912.82,2533105.07,170.89,1
47329,39785,2,12,28,351912.53,2533118.81,172.91,1
47329,39785,3,6,20,351913.03,2533117.41,170.93,1
47329,39797,2,12,10,352063.14,2533117.84,170.66,1
47329,39797,3,6,7,352064.11,2533119.32,170.64,1
47329,39797,2,12,28,352062.77,2533104.67,173.63,1
47329,39797,3,6,20,352063.50,2533107.10,170.69,1
47329,39785,2,12,28,351912.53,2533118.81,172.91,1,1.98
47329,39797,2,12,28,352062.77,2533104.67,173.63,1,2.94
awk -F, 'NR%2{ab = $1 FS $2} ab == ob && $8 - O8 > 1; {ob = ab; O8 = $8}'
预期输出文件:
47329,39785,2,12,10,351912.50,2533105.56,170.93,1
47329,39785,3,6,7,351912.82,2533105.07,170.89,1
47329,39785,2,12,28,351912.53,2533118.81,172.91,1
47329,39785,3,6,20,351913.03,2533117.41,170.93,1
47329,39797,2,12,10,352063.14,2533117.84,170.66,1
47329,39797,3,6,7,352064.11,2533119.32,170.64,1
47329,39797,2,12,28,352062.77,2533104.67,173.63,1
47329,39797,3,6,20,352063.50,2533107.10,170.69,1
47329,39785,2,12,28,351912.53,2533118.81,172.91,1,1.98
47329,39797,2,12,28,352062.77,2533104.67,173.63,1,2.94
awk -F, 'NR%2{ab = $1 FS $2} ab == ob && $8 - O8 > 1; {ob = ab; O8 = $8}'
第3行和第4行具有相同的键(4732939785
),字段8中的值之差为172.91-170.93=1.98
,因此我们打印第4行。第6行和第7行的推理相同
尝试:
47329,39785,2,12,10,351912.50,2533105.56,170.93,1
47329,39785,3,6,7,351912.82,2533105.07,170.89,1
47329,39785,2,12,28,351912.53,2533118.81,172.91,1
47329,39785,3,6,20,351913.03,2533117.41,170.93,1
47329,39797,2,12,10,352063.14,2533117.84,170.66,1
47329,39797,3,6,7,352064.11,2533119.32,170.64,1
47329,39797,2,12,28,352062.77,2533104.67,173.63,1
47329,39797,3,6,20,352063.50,2533107.10,170.69,1
47329,39785,2,12,28,351912.53,2533118.81,172.91,1,1.98
47329,39797,2,12,28,352062.77,2533104.67,173.63,1,2.94
awk -F, 'NR%2{ab = $1 FS $2} ab == ob && $8 - O8 > 1; {ob = ab; O8 = $8}'
我提出了这个脚本,在gawk v5.0.0上进行了测试
BEGIN{
FS=","
}
{
if (NR == 1)
{
key1 = $1
key2 = $2
field = $8
# when on first record, there's nothing to compare with
next
}
if ($1 == key1)
{
if ($2 == key2)
{
if ($8 - field > 1)
{
print $0, $8-field
# uncomment following line to print line match number
# print "("NR")",$0, $8-field
}
}
}
# assign for next iteration
key1 = $1
key2 = $2
field = $8
}
对您的输入进行了测试,发现:
$ awk -f script.awk test.txt
47329,39785,2,12,28,351912.53,2533118.81,172.91,1 2.02
47329,39797,2,12,28,352062.77,2533104.67,173.63,1 2.99
匹配第3行和第7行。预期输出是什么?你能告诉我确切的数字吗?我还是不明白你的意思。您每第二行提到4行(即比较记录2和记录4),但打印记录3(在
4732939785
的情况下)。。。这很令人困惑。你能告诉我们你想比较这4行的内容吗,以及你想打印这4行的内容吗?这个问题也和你之前问的问题相同…这个问题看起来也很相似:BEGIN{FS=OFS=“,”}(k==1fs$2)和($8-f8>1){print$0,$8-f8}{k=$1fs$2;f8=$8}
@OXXO,如果代码很好,解决了你的答案,请考虑接受我的答案。阅读