Linux
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
我只是想按照給定的標準對這些行進行分組,因此組標識符不需要使用我建議的行號方法,如果有更好的方法來做到這一點。
我真的希望有人能提供幫助,因為我總是熱衷於改進我所知道的基本程式碼,所以,如果可能的話,請提供解釋,因為我想從我的錯誤中吸取教訓!
您可以通過將程式碼分散到多行來使其更具可讀性:
awk -F, ' BEGIN { OFS = FS } # Each line { if($3 == prev3 && $4 < prev5 && $6 == prev6) { # 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 prev3 = $3; prev5 = $5; prev6 = $6 } ' 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