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
我该怎么做呢?

计划

  • 读取文件并构造键映射以统计键字段的出现次数
  • 仅打印出现次数等于一次的记录,然后重新读取文件
过滤器.awk

#!/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。输出文件仍然为空,并且在运行脚本时,屏幕上也不会发生任何事情。我已将您的代码复制到一个空白文件中,并使其可执行。。还有别的事要做吗?再次感谢你!对不起,阿姆迪克森,问题已经解决了。这是因为我在用错误的文件做实验。非常感谢你!