빈 줄과 그 위의 줄을 삭제하세요.

빈 줄과 그 위의 줄을 삭제하세요.

수백만 개의 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까지 인쇄한 다음 나머지에서 시작하기 전에 동일한 내용을 삭제합니다. 이를 통해 파일 전체에서 한 줄 미리보기를 수행할 수 있습니다.!$:\nP\nD

답변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

    -rsed확장 정규식을 사용하도록 지시합니다 .

  • -n

    -nsed명시적으로 요청하지 않는 한 어떤 줄도 인쇄하지 마세요.

  • 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= 저장 및 종료)

알았어, 알았어, 이건 나쁜 생각이야: 그렇게 큰 파일을 메모리에 로드하면 안 돼

관련 정보