Awk

awk 在不同的列中添加相應的行

  • April 22, 2022

我有一個名為presidents.txt 的文件。裡面的內容如下…

First  Last  Age  Years
Geogre W     57   8.0
John   A     61   4.0
Thomas J     57   8.0
James  M     57   8.0
Andrew J     61   8.0

我需要的是一個可以增加每位總統的年齡和年限的程序。例如,喬治 W 為 57+8.0,約翰 A 為 61+4.0,依此類推。將每位總統的數字相加後,程序將輸出數字最高的總統的姓名。例如,這裡的輸出應該是“Andrew J at 69”。到目前為止,我可以一次為每位總統執行此操作,但我希望使用 awk 在循環中完成此操作。到目前為止我一直在使用的命令是

awk 'NR==2 {print $3+$4}' presidents.txt

這將添加數字 61 和 4.0,導致輸出 65,我認為這是一個開始。我確定我需要使用循環和數組,但不知道從哪裡開始,因為我對 Unix 或一般編碼沒有太多經驗。任何幫助都值得讚賞。

假設當有重複的結果時 $ 3+ $ 4您只希望列印輸入中的最後一次此類事件:

$ cat tst.awk
NR>1 {
   curYear = $3 + $4
   if ( curYear >= maxYear ) {
       maxName = $1 OFS $2
       maxYear = curYear
   }
}
END {
   print maxName, "at", maxYear
}
$ awk -f tst.awk file
Andrew J at 69

例如,給定這個修改後的輸入文件,其中 2 個人 (Andrew JSheila E) 現在都有 $ 3+ $ 4 值 69:

$ cat file
First  Last  Age  Years
Geogre W     57   8.0
John   A     61   4.0
Thomas J     57   8.0
James  M     57   8.0
Andrew J     61   8.0
Sheila E     65   4.0

使用上面的腳本,我們得到最後一個輸出:

$ awk -f tst.awk file
Sheila E at 69

而也許你想要第一個:

$ cat tst.awk
NR>1 {
   curYear = $3 + $4
   if ( curYear > maxYear ) {
       maxName = $1 OFS $2
       maxYear = curYear
   }
}
END {
   print maxName, "at", maxYear
}
$ awk -f tst.awk file
Andrew J at 69

或全部:

$ cat tst.awk
NR>1 {
   curYear = $3 + $4
   if ( curYear >= maxYear ) {
       if ( curYear > maxYear ) {
           numNames = 0
       }
       maxNames[++numNames] = $1 OFS $2
       maxYear = curYear
   }
}
END {
   for ( nameNr=1; nameNr<=numNames; nameNr++ ) {
       print maxNames[nameNr], "at", maxYear
   }
}
$ awk -f tst.awk file
Andrew J at 69
Sheila E at 69

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