我有一個 csv 檔案用於記錄使用者的登入日期
user1,2019-05-21
user1,2019-05-22
user1,2019-05-23
user2,2019-05-20
user2,2019-05-21
user3,2019-05-24
user3,2019-05-29
user4,2019-05-25
user4,2019-05-28
我需要以下格式。
user1,2019-05-23
user2,2019-05-21
user3,2019-05-29
user4,2019-05-28
我試過awk -F, '!a[$1]++',這給了我第一個值而不是最後一個值。
答案1
$ sort -t, -k1,1 -k2,2r file | sort -t, -u -k1,1
user1,2019-05-23
user2,2019-05-21
user3,2019-05-29
user4,2019-05-28
第一個sort
按使用者和反向日期對資料進行排序。該步驟的輸出看起來像
user1,2019-05-23
user1,2019-05-22
user1,2019-05-21
user2,2019-05-21
user2,2019-05-20
user3,2019-05-29
user3,2019-05-24
user4,2019-05-28
user4,2019-05-25
第二個sort
僅對使用者進行排序,並僅保留每個使用者行的一個實例(遇到的第一個實例)。
答案2
正如評論中指出的,這個問題之前已經被問過,並且已經提供了幾個答案。我還想補充一點:
sort -r input.csv | awk -F, '!a[$1]++' | sort
測試運行:
$ sort -r input.csv | awk -F, '!a[$1]++' | sort
user1,2019-05-23
user2,2019-05-21
user3,2019-05-29
user4,2019-05-28
解釋:
您已經知道如何列印第一列的第一次出現;如果您想要最後一個,則無需再費力:只需使用 對清單進行排序和反轉即可sort -r
。最後一步,並且僅當您需要對結果進行排序時,才再次透過管道傳輸到sort
.
無管道:
您也可以使用單一命令來解決此問題。如果輸入檔已排序(如您的範例所示):
awk -F, '{a[$1]=$2}END{for(k in a){print k","a[k]}}' input.csv
否則:
awk -F, '$2>a[$1]{a[$1]=$2}END{for(k in a){print k" "a[k]}}' input.csv