为了过滤重复的行,我使用了下面的好的awk命令
示例:
cat LogFile | awk '!seen[$0]++'问题是,在某些情况下,我们需要过滤重复行,尽管有些字段是不同的,而且它们并不那么重要。
例如
LogFile:
[INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08
[INFO],[02/Jun/2014-19:31:25],EXE,ds1a,INHT VERION , 1.4.4.3-08
[INFO],[02/Jun/2014-19:32:40],EXE,ds1a,INHT VERION , 1.4.4.3-08请看一下这个文件- LogFile
我需要删除第三个分隔符",“中的重复行,直到行尾,
不管第三个定界符之前是什么
最后,我应该得到这个过滤过的文件:(应该总是列表中的第一个文件)
[INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08所以请帮我完成我的任务
如何从第三个分隔符",“中过滤,而忽略字段:INFO、.、EXE、
注-插入也可以与perl一行
发布于 2014-06-02 18:00:03
使用GNU awk for gensub():
$ awk '!seen[gensub(/([^,]*,){3}/,"","")]++' file
[INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08支持RE间隔的任何awk (最现代的awk):
$ awk '{key=$0; sub(/([^,]*,){3}/,"",key)} !seen[key]++' file
[INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08发布于 2014-06-02 18:13:12
使用perl一行程序:
perl -lne '$k = s/(.*?,){3}//r; print if !$seen{$k}++' file.log产出:
[INFO],[02/Jun/2014-19:30:45],EXE,ds1a,INHT VERION , 1.4.4.3-08解释:
交换机:
-l:启用行结束处理。(只有当日志文件的最后一行缺少新行时才需要)-n:为输入文件中的每一行创建一个while(<>){..}循环。-e:告诉perl在命令行上执行代码。码
$k = s/(.*?,){3}//r:在变量$k中的第三个逗号之后保存所有内容print if !$seen{$k}++:如果前面没有看到键,就打印这一行。发布于 2014-06-02 18:52:00
使用autosplit的方式略有不同:
perl -aF, -ne'print unless $seen{"@F[3..$#F]"}++' logfile.txthttps://stackoverflow.com/questions/24000436
复制相似问题