
次の形式のファイルがあります
>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行目が「-」で区切られた2行に分割され、新しい行に変更され、「>」識別子の前の名前が新しい行にコピーされ、最後に_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番目の列に対してこれを繰り返し、ヘッダーに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
入力を1行ずつ読みます。-l
入力から改行を削除し、print
ステートメントに追加します。-aF/-/
入力を次に分割します。-
ヘッダー行を読み取ると、それを出力して後で使用できるようにヘッダーを保存します。シーケンスを処理するとき、最初の部分、保存されたヘッダー、および2番目の部分を印刷します。
答え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