다음 형식의 파일이 있습니다
>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
추가 처리를 위해 입력 레코드로 이동합니다. header
a \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