从包含时间戳的文件中删除重复行

a c*_*der 8 duplicate awk text-processing deduplication

这个问题/答案有一些很好的解决方案来删除文件中的相同行,但在我的情况下不起作用,因为否则重复的行有一个时间戳。

是否可以告诉 awk 在确定重复项时忽略一行的前 26 个字符?

例子:

[Fri Oct 31 20:27:05 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:10 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:13 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:16 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:21 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:22 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:23 2014] The Brown Cow Jumped Over The Moon
[Fri Oct 31 20:27:24 2014] The Brown Cow Jumped Over The Moon
Run Code Online (Sandbox Code Playgroud)

会成为

[Fri Oct 31 20:27:24 2014] The Brown Cow Jumped Over The Moon
Run Code Online (Sandbox Code Playgroud)

(保留最近的时间戳)

Ant*_*hon 14

您可以使用uniq它的-f选项:

uniq -f 4 input.txt
Run Code Online (Sandbox Code Playgroud)

来自man uniq

  -f, --skip-fields=N
       avoid comparing the first N fields
Run Code Online (Sandbox Code Playgroud)

实际上这将显示第一行:

uniq -f 4 input.txt
Run Code Online (Sandbox Code Playgroud)

如果这是一个问题,你可以这样做:

tac input.txt | uniq -f 4
Run Code Online (Sandbox Code Playgroud)

或者如果你没有tac但你的tail支持-r

tail -r input.txt | uniq -f 4
Run Code Online (Sandbox Code Playgroud)

  • @Ramesh 其中一些工具有一些讨厌的有用选项,当您了解它们时,可以击败您能想到的任何 awk/perl/python 东西。 (3认同)