我有一个大约包含的文本文件。 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