Linux
分組和排序|使用者上次登錄時間
我有一個用於使用者登錄日期的 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 $$++’,這給了我第一個值而不是最後一個值。
$ 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
僅對使用者進行排序,並且僅保留每個使用者行的一個實例(遇到的第一個)。
正如評論中所指出的,這個問題之前已經被問過,並且已經提供了幾個答案。我想再補充一個:
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