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行目が「-」で区切られた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するために入力レコードに移動します。headera\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

関連情報