수백만 개의 DNA 서열이 포함된 대용량 .fna 파일이 있습니다. 프라이머를 잘라낸 후 일부 쓰기 오류로 인해 일부 시퀀스 헤더만 남았고 그 뒤에 시퀀스가 없습니다. 아래에 예가 나와 있습니다. 워크플로 스크립트를 계속 사용할 수 있도록 이러한 헤더와 빈 줄을 제거해야 합니다.
B2S312_20116609 HWI-ST1128:217:D2HB4ACXX:8:1101:20814:45721 orig_bc=CCGCATAA new_bc=CCGCATAA bc_diffs=0
AACCATGCACCACCTGTATCTGTGTCTAACCAAAGGTCAGAACAACACAATCTCTTGTGTCCTCACAGTATGTCAAGACTT
B4S315_20116610 HWI-ST1128:217:D2HB4ACXX:8:1101:20948:45746 orig_bc=ATATGCCG new_bc=ATATGCCG bc_diffs=0
AACCATGCACCACCTGCACACGACCAACTAAATGCCACCACATCTCTGCAGTGTCGCCGTGCATGTCAAGCCTT
A3C214_20116611 HWI-ST1128:217:D2HB4ACXX:8:1101:20874:45747 orig_bc=GATCCAAC new_bc=GATCCAAC bc_diffs=0
A2C214_20116612 HWI-ST1128:217:D2HB4ACXX:8:1101:21248:45534 orig_bc=CCTAGGAT new_bc=CCTAGGAT bc_diffs=0
AACCGTGCACCACCTGTTTTCTGGCTTCCGAAGAAGAGGAACTATCTCTAGTTCTGTCCATCAATGTCAAGACCT
A3C214_20116611 HWI-ST1128:217:D2HB4ACXX:8:1101:20874:45747 orig_bc=GATCCAAC new_bc=GATCCAAC bc_diffs=0
따라서 이 예에서는 해당 행과 그 아래의 빈 행을 삭제하고 싶습니다 .
sed만 사용하여 빈 줄을 제거했지만 내 시나리오에 적합한 예제를 찾을 수 없습니다.
답변1
sed '$!N;/:.*\n$/d;P;D' <infile
위 명령은 N
마지막 줄이 아닌 모든 줄에서 추가 줄을 가져옵니다. 콜론이 발견되고 마지막 문자가 줄바꿈인 패턴 공간을 발견하면 배치가 삭제됩니다. 즉, 콜론이 포함된 줄과 다음 줄이 비어 있으면 둘 다 제거됩니다. 다른 모든 경우에는 패턴 공간에서 처음으로 나타나는 ewline까지 인쇄한 다음 나머지에서 시작하기 전에 동일한 내용을 삭제합니다. 이를 통해 파일 전체에서 한 줄 미리보기를 수행할 수 있습니다.!
$
:
\n
P
\n
D
답변2
(아래 솔루션의 경우 각 헤더 + 시퀀스 라인 앞에 빈 줄을 원한다고 가정합니다. 뒤에 빈 줄을 원하면 알려주세요. 쉽게 변경할 수 있습니다.)
사용sed
$ sed -rn 's/(.{106})/\n\1/p' file
B2S312_20116609 HWI-ST1128:217:D2HB4ACXX:8:1101:20814:45721 orig_bc=CCGCATAA new_bc=CCGCATAA bc_diffs=0 AACCATGCACCACCTGTATCTGTGTCTAACCAAAGGTCAGAACAACACAATCTCTTGTGTCCTCACAGTATGTCAAGACTT
B4S315_20116610 HWI-ST1128:217:D2HB4ACXX:8:1101:20948:45746 orig_bc=ATATGCCG new_bc=ATATGCCG bc_diffs=0 AACCATGCACCACCTGCACACGACCAACTAAATGCCACCACATCTCTGCAGTGTCGCCGTGCATGTCAAGCCTT
A2C214_20116612 HWI-ST1128:217:D2HB4ACXX:8:1101:21248:45534 orig_bc=CCTAGGAT new_bc=CCTAGGAT bc_diffs=0 AACCGTGCACCACCTGTTTTCTGGCTTCCGAAGAAGAGGAACTATCTCTAGTTCTGTCCATCAATGTCAAGACCT
어떻게 작동하나요?
-r
-r
sed
확장 정규식을 사용하도록 지시합니다 .-n
-n
sed
명시적으로 요청하지 않는 한 어떤 줄도 인쇄하지 마세요.s/(.{106})/\n\1/p
줄에 106자 이상이 있으면 시작 부분에 개행 문자를 추가하고 인쇄합니다.
빈 줄에는 106자가 없으므로 인쇄되지 않습니다.
DNA 서열이 없는 줄은 106자보다 짧으므로 인쇄되지 않습니다.
DNA 서열이 포함된 라인을 인쇄합니다(106자 이상). 빈 줄 자체는 인쇄되지 않기 때문에 줄 시작 부분에 개행 문자를 추가해야 합니다. 이렇게 하면 각 DNA 레코드 앞에 빈 줄이 옵니다.
GNU가 아닌sed
OSX(BSD)를 사용하는 경우 다음을 시도해 보세요.
sed -E -n -e 's/(.{106})/\n\1/p' file
사용awk
awk '$6 {print "\n"$0}' file
DNA 서열은 행의 여섯 번째 필드입니다. 따라서 비어 있지 않은 여섯 번째 필드가 있는 줄의 경우 해당 줄 앞에 개행 문자를 인쇄합니다.
답변3
다음을 사용하여 이 작업을 수행할 수 있다는 점을 언급하고 싶었습니다 vi
.
:g/PATTERN/normal 2dd
PATTERN
당신이 찾고 있는 것은 어디에 있습니까? 그러면 패턴에 따라 일치 PATTERN
하고 실행 됩니다 2dd
(행 삭제 - 2회) .normal
답변4
Ex/vi 사용
@ReulSharabin이 제안한 명령을 실행하십시오.
ex -s +'g/bc_diffs=0$/d +2' +x file
이는 다음과 유사합니다.
vim +':g/bc_diffs=0$/d +2' +:x file
(+명령 = 명령 실행; +x
= 저장 및 종료)
알았어, 알았어, 이건 나쁜 생각이야: 그렇게 큰 파일을 메모리에 로드하면 안 돼