分組和排序 |使用者上次登入時間

分組和排序 |使用者上次登入時間

我有一個 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

相關內容