删除显示唯一 STRING 的行

删除显示唯一 STRING 的行

我有一个大约包含的文本文件。 1200万行,每行由4个字段组成(第1、2、3和4列)

大多数行在第 2 列中都有一个唯一的 STRING,我想删除它们。整个文本文件根据第 2 列进行排序(从小到大);第 2 列中具有相同 STRING 的行始终是连续的。

在文本文件中,我通常在第 2 列中包含 2、3、4 或 5 个连续行,其中包含相同的字符串。这些是我希望保留在最终文本文件中的行:

column1 column2 column3 column4  
WT 1 ILS G  
WT 2 DSG E          
WT 3 WYT S 
. . . .  
WT 106  AAA X  
WT 106  BBB Y  
. . . .  
WT 2704 CCC X  
WT 2704 DDD Y 
WT 2704 EEE X  
. . . .  
WT 87520 FFF X  
WT 87520 GGG X  
WT 87520 HHH X  
WT 87520 III Y  
. . . .  


我想要实现的目标:

column1 column2 column3 column4  
WT 106  AAA X  
WT 106  BBB Y  
WT 2704 CCC X  
WT 2704 DDD Y 
WT 2704 EEE X  
WT 87520 FFF X  
WT 87520 GGG X  
WT 87520 HHH X  
WT 87520 III Y  

预先感谢您的时间和帮助。最好的,

洛朗

答案1

awk 'FNR==1 {print; next} $2==p2 {print p $0; p=""; next} {p=$0 ORS; p2=$2}' file

如果第 2 列匹配:打印上一行和当前行,清空保存上一行的变量,然后转到下一行。

答案2

您可以用来uniq -D打印重复行,但它只能跳过左侧的字段。因此,我们需要应用rev反转每条线,然后使用uniq,最后rev再次使用将线反转回来。

rev file | uniq -f2 -D | rev

答案3

itertools使用该模块和方法来处理分组输入数据问题groupby。它需要两个参数:一个迭代器,在我们的例子中是输入文件句柄。和一个指定函数的键(在我们的例子中是一个匿名函数)

python3 -c 'import sys
from itertools import groupby
ifile,prntHdr = sys.argv[1],False
with open(ifile) as f:
  for k,igrp in groupby(f, lambda x: x.split()[1]):
    G = list(igrp)
    if not prntHdr or len(G) > 1:
      print(*G,sep="",end="")
      prntHdr = True
' file

perl -nae '
  push @A, $_;
  if ($prev ne $F[1] || $.==1) {
    print(splice(@A,0,@A-(@A>2?1:$.==1?0:@A)));
    shift @A if @A>1;
    $prev = $F[1];
  }
  END { print @A if @A>1; }
' file

sed -Ee '1b
  $!N
  /^\S+\s+(\S+)\s.*\n\S+\s+\1\s/{
    P;h;D  
  }
  x
    /./{x;P;x;z;}
  x
  D
' file

相关内容