awk를 사용하여 파일의 줄을 변경하고 조작합니다.

awk를 사용하여 파일의 줄을 변경하고 조작합니다.

다음 형식의 파일이 있습니다

>M03117:162:000000000-ATLWF:1:1114:22047:12565:307
TCCGAAAGT-ACAACGTGT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307
TTCGAAAGTT-GGTGAGGTGTGGG
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307
TCCGAAAGTTCTCCGA-CTTGGCTTCCTAG
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307
GACGAAAGTTCACCGATA-GAGGTAGAAGGTGCAGTGGGGA

두 번째 줄이 "-"로 구분된 두 줄로 분할되어 새 줄로 바뀌고 ">" 식별자 앞의 이름이 새 줄에 복사되고 끝에 _2로 이름이 바뀌도록 이 줄을 조작하고 변경하고 싶습니다. , 다음과 같이;

>M03117:162:000000000-ATLWF:1:1114:22047:12565:307
TCCGAAAGT
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307_2
ACAACGTGT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307
TTCGAAAGTT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307_2
GGTGAGGTGTGGG
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307
TCCGAAAGTTCTCCGA
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307_2
CTTGGCTTCCTAG
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307
GACGAAAGTTCACCGATA
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307_2
GAGGTAGAAGGTGCAGTGGGGA

나는 이것이 awk로 이루어질 수 있다는 것을 알고 있지만 어떤 방법으로도 알 수 없습니다.

답변1

"awk 사용"에 대해 구체적으로 질문했기 때문에

awk -F- '
  /^>/ {hdr=$0; next} 
  {print hdr ORS $1; for(i=2;i<=NF;i++) print hdr"_"i ORS $i}
' file

답변2

>in으로 시작하는 줄을 캡처 header하고 next추가 처리를 위해 입력 레코드로 이동합니다. headera \n와 열 1을 사용하여 줄을 인쇄하는 것보다새로운기록을 입력하세요. 그런 다음 두 번째 열에 대해 이를 반복하고 헤더에 2를 추가합니다.

$ awk -F- '/^>/{header=$0; next}{print header ORS $1; print header"_2" ORS $2}' file
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307
TCCGAAAGT
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307_2
ACAACGTGT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307
TTCGAAAGTT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307_2
GGTGAGGTGTGGG
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307
TCCGAAAGTTCTCCGA
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307_2
CTTGGCTTCCTAG
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307
GACGAAAGTTCACCGATA
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307_2
GAGGTAGAAGGTGCAGTGGGGA

답변3

Perl이 구조하러 옵니다

perl -laF/-/ -ne '
    if (/^>/) { print; $header = "$_\_2"; }
    else { print join "\n", $F[0], $header, $F[1] }
' -- input-file
  • -n입력을 한 줄씩 읽습니다.
  • -l입력에서 줄 바꿈을 제거하고 print명령문 에 추가합니다.
  • -aF/-/입력을 다음으로 분할합니다.-

헤더 행을 읽으면 이를 출력하고 나중에 사용할 수 있도록 헤더를 저장합니다. 시퀀스를 처리할 때 첫 번째 부분, 저장된 헤더 및 두 번째 부분을 인쇄합니다.

답변4

스스로 도움을 주고 싶지만 프로그래밍을 배우고 싶지 않은 경우 를 사용하면 됩니다 sed. 를 사용하면 언제든지 다음 줄을 읽을 수 있고 N, 이중선을 둘러싸인 부분으로 분할 ()하고 필요에 따라 첫 번째 줄에서 참조하는 부분을 결합할 수 있습니다. 등등 \1:

sed -E 'N;s/(.*)(\n)(.*)-(.*)/\1\2\3\2\1_2\2\4/' file

정규식을 확장하지 않고도(옵션 없음 -E) 이 작업을 수행할 수 있지만 백슬래시로 인해 길을 잃을 수도 있습니다.

sed 'N;s/\(.*\)\(\n\)\(.*\)-\(.*\)/\1\2\3\2\1_2\2\4/' file

홀딩 버퍼를 사용하여 동일한 결과를 얻을 수 있지만, 초보자라면 덜 명확합니다 sed.

sed 'h;n;y/-/\n/;P;s/.*\n//;x;s/$/_2/;G' file

관련 정보