>
다음 줄로 시작하는 중복 줄을 제거하고 싶습니다 .
예를 들어:
>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