대략적인 내용을 포함하는 텍스트 파일이 있습니다. 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
. 두 개의 매개변수, 즉 반복자(우리의 경우 입력 파일 핸들)를 사용합니다. 함수를 지정하는 키(이 경우 익명 함수)
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