Awk 比较特定列的两行中的值

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,

我想根据前一行的条件打印文件行。我想实施以下条件:

如果当前行和上一行之间的键(字段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,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,如果代码很好,解决了你的答案,请考虑接受我的答案。阅读