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