这问题/答案有一些很好的解决方案用于删除文件中的相同行,但在我的情况下不起作用,因为否则重复的行有时间戳。
是否可以告诉 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
(保留最近的时间戳)
答案1
你可以只使用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
答案2
awk '!seen[substr($0,27)]++' file
答案3
试试这个:
awk -F ']' '{a[$2]=$1}END{for(i in a){print a[i]"]"i}}'
答案4
人们可以使用 的幂vim
:
:g/part of duplicate string/d
好简单。如果您还有更多文件(例如 gzipped旋转的日志),vim
将打开它们,而无需您进行任何初步解压缩,您可以通过按:和重复最后一个命令↑。就像在终端中重复最后一个命令一样。