Awk
awk 在不同的列中添加相應的行
我有一個名為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 J
和Sheila 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