根据文件中的不同列排序和删除重复项

时间:2016-11-30 04:03:11

标签: linux bash awk

我有一个文件,其中有三列(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/>

我不知道该怎么做。

3 个答案:

答案 0 :(得分:2)

如果要保留每个第3列条目的最早实例,可以进行两次排序;第一次对重复项进行分组,第二次在删除重复项后按时间恢复排序。 (以下假设默认排序适用于日期和值,并且所有行都有三列具有一致的空格。)

sort -k3 -k1,2 inputFile | uniq -f2 | sort > sortedFile

-f2的{​​{1}}选项告诉它在第二个字段的末尾开始比较,以便不考虑日期字段。

答案 1 :(得分:1)

如果毫秒不重要,以下是另一种消除毫秒并执行sortuniq的方法:

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