我有一个文件,其中有三列(yyyy-mm-dd hh:mm:ss.000 12位数字):
2016-11-30 23:40:45.578 5001234567890
2016-11-30 23:40:45.568 5001234567890
2016-11-30 23:40:45.578 5001234567890
2016-11-30 23:40:45.478 5001234567891
2016-11-30 23:40:45.578 5001234567891
我想首先根据日期时间(前两列)对文件进行排序,然后必须删除具有重复数字的行(第三列)。
所以在此之后,上面的文件将如下所示:
2016-11-30 23:40:45.478 5001234567891
2016-11-30 23:40:45.568 5001234567890
我使用了key和awk
命令(如下所示),但结果不正确..(我不确定哪些条目被删除,因为我正在处理的文件太大。)
命令:
sort -k1 inputFile > sortedInputFile<br/>
awk '!seen[$3]++' sortedInputFile > outputFile<br/>
我不知道该怎么做。
答案 0 :(得分:2)
如果要保留每个第3列条目的最早实例,可以进行两次排序;第一次对重复项进行分组,第二次在删除重复项后按时间恢复排序。 (以下假设默认排序适用于日期和值,并且所有行都有三列具有一致的空格。)
sort -k3 -k1,2 inputFile | uniq -f2 | sort > sortedFile
-f2
的{{1}}选项告诉它在第二个字段的末尾开始比较,以便不考虑日期字段。
答案 1 :(得分:1)
如果毫秒不重要,以下是另一种消除毫秒并执行sort
和uniq
的方法:
awk '{print $1" "substr($2,1,index($2,".")-1)" "$3 }' file1.txt | sort | uniq
答案 2 :(得分:0)
这是awk中的一个。它在$3
上进行分组并存储最早的时间戳,但输出顺序是随机的,因此输出应通过管道传输到sort
。
$ awk '
(a[$3] == "" || a[$3] > ($1 OFS $2)) && a[$3]=($1 OFS $2) { next }
END{ for(i in a) print a[i], i }
' file # | sort goes here
2016-11-30 23:40:45.568 5001234567890
2016-11-30 23:40:45.478 5001234567891