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


8

这个问题/答案为删除文件中的相同行提供了一些很好的解决方案,但是对我来说不起作用,因为否则重复的行都带有时间戳。

是否可以让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

会成为

[Fri Oct 31 20:27:24 2014] The Brown Cow Jumped Over The Moon

(保留最近的时间戳记)


4
是。如果要发布一些示例输入和输出,那么这可能是一个问题。
jasonwryan 2014年

3
提出此类问题时,您需要包括您的输入和所需的输出。如果我们不得不猜测,我们无能为力。
terdon

1
“是”或“否”似乎是可以接受的答案,那么您将如何处理这些知识?如果没有,请延长awk?
Anthon 2014年

1
哇。80,000名代表声称这是一个无法使用的问题(我不会称其为好问题),但没有一次封闭投票?
Hauke Laging

5
@HaukeLaging似乎可以给OP一个机会来回应我们的评论。他们现在已经这样做了,这个问题已经大大改善了。
terdon

Answers:


14

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

uniq -f 4 input.txt

来自man uniq

  -f, --skip-fields=N
       avoid comparing the first N fields

实际上,这将显示第一行:

[Fri Oct 31 20:27:05 2014] The Brown Cow Jumped Over The Moon

如果这是一个问题,您可以执行以下操作:

tac input.txt | uniq -f 4

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

tail -r input.txt | uniq -f 4

1
这真是太棒了:)
Ramesh 2014年

3
@Ramesh这些工具中的一些工具有一些讨厌的有用选项,当您知道它们时,可以击败您可以想到的任何awk / perl / python东西。
Anthon 2014年

4
awk '!seen[substr($0,27)]++' file

此解决方案不涉及时间戳部分,因为在编写此答案时这不是问题的一部分。
Hauke Laging

2
这就是为什么我们许多人在Q完全充实之前努力关闭它们的原因。否则,这些Q会浪费您的时间,而OP则会浪费您的时间。
slm

3

试试这个:

awk -F ']' '{a[$2]=$1}END{for(i in a){print a[i]"]"i}}'

0

一个perl解决方案:

perl -F']' -anle '$h{$F[1]} = $_; END{print $h{$_} for keys %h}' file

0

一个人可以利用的力量vim

:g/part of duplicate string/d

很容易。如果您还有更多文件(例如,压缩后的旋转日志),vim将打开它们而不会进行任何初步的压缩操作,您可以通过按:和重复最后一个命令。就像在终端中重复上一条命令一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.