在特定列的子列中匹配后删除文件中的重复行

时间:2015-09-03 09:24:48

标签: bash duplicates matching

我有一个未分类的文件,其中包含多列中的行数据,如下例所示:

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列的行,并从文件中删除所有这些行。

因此,结果应该是,在这个例子中:

with open("Test1.txt", "r") as File1:
St = (' '.join(format(ord(x), 'b') for x in File1.read()))
StrList = St.split(" ")

我该怎么做?

1 个答案:

答案 0 :(得分:0)

<强>计划

  
      
  • 读取文件并构造一个键映射以计算关键字段的出现次数
  •   
  • 重新读取文件,仅打印出现次数等于一的记录
  •   

<强> filter.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