我想列印以下檔案中的最后一組,第一個欄位是關鍵。
輸入:
62,2010-06-19,27.40
62,2010-06-20,35.40
62,2010-06-21,8.50
63,2010-06-19,56.40
63,2010-06-20,23.76
63,2010-06-21,12.50
63,2010-06-22,87.12
64,2010-06-19,87.40
64,2010-06-20,32.40
64,2010-06-21,21.50
64,2010-06-22,73.40
所需輸出:
64,2010-06-19,87.40
64,2010-06-20,32.40
64,2010-06-21,21.50
64,2010-06-22,73.40
我嘗試用
awk -F, ' { p=NR==1?1:p; a[NR]=$0 } p!=$1 { delete a; p=$1 } END { for(i in a) print a[i] } '
但它缺少一行。
CodePudding
最有效的(也是最簡短的)方法是:
$ tac file | awk -F',' '(NR>1) && ($1! =p){exit} {print; p=$1}' | tac
64,2010-06-19,87.40
64,2010-06-20,32.40
64,2010-06-21,21.50
64,2010-06-22,73.40
或者如果你沒有tac:
$ awk -F',' '$1!=p{rec=""; p=$1}. {rec=rec $0 ORS} END{printf "%s", rec}' 檔案
64,2010-06-19,87.40
64,2010-06-20,32.40
64,2010-06-21,21.50
64,2010-06-22,73.40
或者,如果你出于某種原因喜歡將最后一條記錄存盤在一個陣列中,而不是一個字串:
$ awk -F',' '$1!=p{n=0; p=$1}! {rec[ n]=$0}。END{for (i=1; i<=n; i ) print rec[i]}' file
64,2010-06-19,87.40
64,2010-06-20,32.40
64,2010-06-21,21.50
64,2010-06-22,73.40
你的腳本中的for(i in a)會改變行的順序,所以輸出的順序不會與輸入的順序相同(除非是巧合)。
另外,關于p=NR==1?$1:p--如果你把三元運算式用小括號括起來,總是更容易閱讀,而且在某些情況下,如果你不這樣做,它們會導致awks的語法錯誤,所以總是把它們括起來,例如:p=(NR==1?$1:p)。
uj5u.com熱心網友回復:
另一種不使用陣列的tac awk tac解決方案:
tac file | awk -F, 'p && $1 != p{exit} {p = $1}' | tac
64,2010-06-19,87.40
64,2010-06-20,32.40
64,2010-06-21,21.50
64,2010-06-22,73.40
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/318121.html
標籤:
