分组和排序|用户上次登录时间

分组和排序|用户上次登录时间

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

相关内容