Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 根据文件中的不同列排序并删除重复项_Linux_Bash_Awk - Fatal编程技术网

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

Linux 根据文件中的不同列排序并删除重复项,linux,bash,awk,Linux,Bash,Awk,我有一个文件,其中有三列(yyyy-mm-dd hh:mm:ss.000 12位数字): 我想首先根据日期时间(前两列)对文件进行排序,然后必须删除具有重复编号的行(第三列)。因此在此之后,上面的文件将如下所示: 2016-11-30 23:40:45.478 5001234567891 2016-11-30 23:40:45.568 5001234567890 我使用了带键排序和awk命令(如下所示),但结果不正确(我不太确定要删除哪些条目,因为我正在处理的文件太大。) 命令: sort -

我有一个文件,其中有三列(yyyy-mm-dd hh:mm:ss.000 12位数字):

我想首先根据日期时间(前两列)对文件进行排序,然后必须删除具有重复编号的行(第三列)。
因此在此之后,上面的文件将如下所示:

2016-11-30 23:40:45.478 5001234567891
2016-11-30 23:40:45.568 5001234567890
我使用了带键排序和
awk
命令(如下所示),但结果不正确(我不太确定要删除哪些条目,因为我正在处理的文件太大。)
命令:

sort -k1 inputFile > sortedInputFile<br/>
awk '!seen[$3]++' sortedInputFile > outputFile<br/>
sort-k1 inputFile>sortedInputFile
啊!已查看[$3]+'sortedInputFile>outputFile

我不知道怎么做。

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


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

如果毫秒不重要,下面是另一种方法,它删除毫秒并执行
排序
uniq


awk'{print$1''substr($2,1,index($2,”)-1)“$3}”file1.txt | sort | uniq

这里是awk中的一个。它在
$3
上分组并存储最早的时间戳,但输出顺序是随机的,因此输出应该通过管道传输到
排序

$ 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

我尝试了这个命令,但没有删除所有的重复项。在上面的命令之后,我使用了awk命令,它工作了。原因可能是什么?@k.thanvi:也许在某些行中有尾随的垃圾(甚至是空白)。在跳过字段后,
uniq
命令逐字节比较行,而awk程序只比较第三个字段。试试hextumping(使用
hd
)两个没有被消除的重复行。@K.Thanvi:现在我想起来了,第二个字段和第三个字段之间的空格也可能不同,因为
uniq-f2
在第二个字段结束后开始比较,而不是在第三个字段开始时——也就是说,它包括第二个和第三个字段之间的空白。因此,如果一行具有单个空间,另一行具有相同的第三字段,但在其之前有两个空格,则<代码> UNIQ将考虑那些不同的行。
sort -k3 -k1,2 inputFile | uniq -f2 | sort > sortedFile
$ 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