Awk - 将每行的几列与前一行进行比较

Awk - 将每行的几列与前一行进行比较

我已经对此进行了多次尝试,但显然遗漏了一些东西并且需要帮助。

我有一个包含数千行信息的大表,我试图根据第 3、4 和 6 列将它们分类。我已经按这些列对行进行了排序,现在只想执行以下操作:

如果第 3 列=前几行第 3 列 && 第 4 列 < 前几行第 5 列 && 第 6 列 = 前几行第 6 列;然后打印该行,但用第一个出现的匹配的行号修改开头;否则打印该行但修改当前行号的开头

这是我的糟糕方法,充满了错误:

awk -F, 'BEGIN { OFS = FS } {if ($4<prev5 && $3==prev3 && $6==prev6) print Marker,$0;else Marker=NR print NR,$0; prev5=$5; prev3=$3; prev6=$6}'

输入示例(为了便于查看,以逗号分隔):

a,b,2,15,50,ABBA    
a,a,2,26,55,ABBA    
b,a,2,80,99,ABA    
c,a,3,20,40,CAN    
a,b,3,51,300.CAN    
a,a,4,1000,2000,ART   
d,c,4,1700,2050,ART    
b,a,4,1800,2051,ART

输出示例:

1,a,b,2,15,50,ABBA    
1,a,a,2,26,55,ABBA    
3,b,a,2,80,99,ABA    
4,c,a,3,20,40,CAN    
5,a,b,3,51,300.CAN    
6,a,4,1000,2000,ART   
6,c,4,1700,2050,ART    
6,b,a,4,1800,2051,ART   

我只是想按给定的标准对这些行进行分组,因此组标识符不需要使用我建议的行号方法,如果有更好的方法可以做到这一点。

我真的希望有人可以帮助解决这个问题,因为我总是热衷于改进我所知道的基本代码,所以如果可能的话,也请提供解释,因为我想从我的错误中学习!

答案1

您可以通过将代码分散在几行中来使其更具可读性:

awk -F, '
    BEGIN { OFS = FS }

    # Each line
    {
        if($3 == prev[3] && $4 < prev[5] && $6 == prev[6])
        {
            # Capture and use record number of last match
            if(!nrMatched) { nrMatched = NR-1 }
            print nrMatched, $0
        }
        else
        {
            # No match, reset matched flag and just copy record through
            nrMatched = 0
            print NR, $0
        }

        # Save fields from this line for next comparison
        split($0, prev)
    }
' datafile

输出

1,a,b,2,15,50,ABBA
1,a,a,2,26,55,ABBA
3,b,a,2,80,99,ABA
4,c,a,3,20,40,CAN
5,a,b,3,51,300.CAN
6,a,a,4,1000,2000,ART
6,d,c,4,1700,2050,ART
6,b,a,4,1800,2051,ART

相关内容