おおよその内容を含むテキストファイルがあります。 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