Bash 在特定列子集中进行匹配后,删除文件中的重复行
我有一个未排序的文件,包含许多列中的行数据,如本例所示:Bash 在特定列子集中进行匹配后,删除文件中的重复行,bash,duplicates,matching,Bash,Duplicates,Matching,我有一个未排序的文件,包含许多列中的行数据,如本例所示: 10:23:55.521803 [INFO] eceb [ 41] 235 870 1 26601 349 910 10:24:11.771454 [INFO] eceb [ 41] 41 870 0 26601 349 910 10:25:18.858675 [INFO] eceb [ 41] 235 870 3 26601 349 910 10:25:18.814763 [INFO] eceb [ 41] 60 1247 0 3849
10:23:55.521803 [INFO] eceb [ 41] 235 870 1 26601 349 910
10:24:11.771454 [INFO] eceb [ 41] 41 870 0 26601 349 910
10:25:18.858675 [INFO] eceb [ 41] 235 870 3 26601 349 910
10:25:18.814763 [INFO] eceb [ 41] 60 1247 0 38490 163 715
10:25:19.844738 [INFO] eceb [ 41] 60 1248 0 38490 163 715
10:24:11.771454 [INFO] eceb [ 41] 41 870 0 26641 389 920
10:25:18.814763 [INFO] eceb [ 41] 60 1247 0 38490 163 715
10:25:19.844738 [INFO] eceb [ 41] 60 1248 0 38490 163 715
我想识别所有行,仅考虑第4、5和6列,它们是相同的,并从文件中删除所有这些行
因此,在本例中,结果应为:
10:23:55.521803 [INFO] eceb [ 41] 235 870 1 26601 349 910
10:24:11.771454 [INFO] eceb [ 41] 41 870 0 26601 349 910
10:25:18.858675 [INFO] eceb [ 41] 235 870 3 26601 349 910
10:25:18.814763 [INFO] eceb [ 41] 60 1247 0 38490 163 715
10:25:19.844738 [INFO] eceb [ 41] 60 1248 0 38490 163 715
10:24:11.771454 [INFO] eceb [ 41] 41 870 0 26641 389 920
10:25:18.814763 [INFO] eceb [ 41] 60 1247 0 38490 163 715
10:25:19.844738 [INFO] eceb [ 41] 60 1248 0 38490 163 715
我该怎么做呢?计划
- 读取文件并构造键映射以统计键字段的出现次数
- 仅打印出现次数等于一次的记录,然后重新读取文件
#!/usr/bin/awk -f
function get_key(k1, k2, k3, k4) \
{ \
if(k1 == "[") \
{ \
key = k1","k2","k3","k4""; \
} \
else \
{ \
key = k1","k2","k3""; \
} \
return key; \
} \
\
BEGIN \
{ \
} \
(FNR==NR) \
{ \
key = get_key($4, $5, $6, $7); \
a[key] = a[key] + 1; \
} \
(FNR!=NR) \
{ \
key = get_key($4, $5, $6, $7); \
if(a[key] == 1) \
{ \
printf $0"\n"; \
} \
} \
输出
$ ./filter.awk input.txt input.txt
10:25:18.814763 [INFO] eceb [ 41] 60 1247 0 38490 163 715
10:25:19.844738 [INFO] eceb [ 41] 60 1248 0 38490 163 715
我不明白你的例子。为什么最后一行被删除了呢?为什么余下的行在COL 4, 5和6中具有相同的值?如果我们考虑列4、5和6,行2和最后一行具有相同的值,即41, 41和870。其余的行在第4、5和6列中需要有不同的值,与您迄今为止尝试过的任何其他行不同??谢谢您的建议!我知道计划是什么,但当我在终端中运行./filter.awk input.txt output.txt时,没有任何事情发生(输出文件为空),需要运行
/filter.awk input.txt input.txt
才能在标准输出上查看输出。或者,您可以使用/filter.awk input.txt input.txt 1>output.txt重定向到output.txt。输出文件仍然为空,并且在运行脚本时,屏幕上也不会发生任何事情。我已将您的代码复制到一个空白文件中,并使其可执行。。还有别的事要做吗?再次感谢你!对不起,阿姆迪克森,问题已经解决了。这是因为我在用错误的文件做实验。非常感谢你!