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

おすすめ記事