패턴으로 시작하는 중복 줄과 그 다음 줄을 제거하는 방법은 무엇입니까?

패턴으로 시작하는 중복 줄과 그 다음 줄을 제거하는 방법은 무엇입니까?

>다음 줄로 시작하는 중복 줄을 제거하고 싶습니다 .

예를 들어:

>1
ACCGGTTTCCTTGAAATT
>2 
AACCTTCCGGTTAATT
>3 
AACCTTCCGGTTAATT
>1 
ACCGGTTTCCTTGAAATT

보시다시피 다음 두 행이 중복되었습니다.

AACCTTCCGGTTAATT and >1 

하지만 다음 줄만 삭제하고 싶기 >1때문에 출력이 다음과 같기를 원합니다.

>1
ACCGGTTTCCTTGAAATT
>2
AACCTTCCGGTTAATT
>3
AACCTTCCGGTTAATT

내가 다음과 같은 것을 사용한다면 :

awk '!seen[$0]++'  filename

출력은 다음과 같습니다

>1
ACCGGTTTCCTTGAAATT
>2
AACCTTCCGGTTAATT
>3

>모든 중복 행을 제거하고 그 이후의 다음 행 부터 시작하는 중복 행만 제거하고 싶기 때문입니다 .

내 실제 파일은 약 수천 줄이므로 >기호 뒤에 반복 가능한 이름이 여러 개 있을 수 있습니다.

어떤 제안이 있으십니까?

답변1

getline다음 줄을 얻으려면 awk에서 사용할 수 있습니다 .

awk '/^>/{ if(!seen[$0]++){ print;getline;print } else { getline } }'

여러 줄을 처리하는 더 간단한 대답이 있습니다.

awk '/^>/{ skip = seen[$0]++ }
     { if(!skip)print }'

답변2

POSIX 도구 상자 사용:

paste - - <file | awk '{$1=$1};!seen[$0]++' | tr '\t' '\n'

답변3

그리고 awk:

awk 'NR%2==1{l=$0;next} !seen[l"\n"$0]++{print l"\n"$0}' file
  • NR%2==1>1모든 두 번째 행은 true이므로 , >2및 가 있는 행은 입니다 >3. 이 경우 내용을 변수에 저장하고 l해당 줄을 계속 진행하세요 next.
  • !seen[l"\n"$0]++여기서는 고유한 행을 확인하지 않고 확인합니다.2독특한 연속선.
    • 고유한 경우 마지막 줄 l과 현재 줄 $0사이에 개행 문자를 넣어 인쇄합니다 \n.

산출:

>1 
ACCGGTTTCCTTGAAATT
>2 
AACCTTCCGGTTAATT
>3 
AACCTTCCGGTTAATT

관련 정보