Linux

awk - 將每行的幾列與上一行進行比較

  • October 10, 2022

我已經為此做了幾次嘗試,但顯然遺漏了一些東西並需要幫助。

我有一個包含數千行資訊的大表,我正在嘗試根據第 3、4 和 6 列將它們分類。我已經按這些列對行進行了排序,現在只想執行以下操作:

如果第 3 列=前行第 3 列 && 第 4 列 < 前行第 5 列 && 第 6 列 = 前行第 6 列;然後列印該行,但用第一個匹配的行號修改開頭;否則列印該行但用目前行號修改開頭

這是我充滿錯誤的糟糕方法:

awk -F, 'BEGIN { OFS = FS } {if ($4&lt;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 &lt; 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

引用自:https://unix.stackexchange.com/questions/720456