一意のSTRINGを表示する行を削除する

一意のSTRINGを表示する行を削除する

おおよその内容を含むテキストファイルがあります。 1,200万行、各行は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。 2つのパラメータ、つまりイテレータ(私たちの場合は入力ファイルハンドル)を使用します。関数を指定するキー(この場合は匿名関数)

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

関連情報