고유한 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. 두 개의 매개변수, 즉 반복자(우리의 경우 입력 파일 핸들)를 사용합니다. 함수를 지정하는 키(이 경우 익명 함수)

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

관련 정보