awk ジョブ

awk ジョブ

このようなファイルがあります。

SRR959756.1081725       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.1162547       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.128602        2       RNU2-37P:85:108:hsa-miR-877-3p  RNU2-59P:99:122:hsa-miR-877-3p

これはタブ区切りのファイルで、次のような結果が必要です。

SRR959756.1081725       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.1162547       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.128602        2       RNU2-37P:85:108:hsa-miR-877-3p  
SRR959756.128602        2       RNU2-59P:99:122:hsa-miR-877-3p

3行目と同様に、3列目と4列目があります。ただし、常に最初と2番目の列、3番目の列、次の行に1番目と2番目の列、4番目の列を印刷する必要があります。

awkでどうすればいいですか?

答え1

$ awk -v OFS='\t' '{for (i=3;i<=NF;i++)print $1,$2,$i}' file
SRR959756.1081725       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.1162547       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.128602        2       RNU2-37P:85:108:hsa-miR-877-3p
SRR959756.128602        2       RNU2-59P:99:122:hsa-miR-877-3p

どのように動作しますか?

  • -v OFS='\t'

    これにより、出力フィールド区切り記号AKAがタブにOFS設定されます。

  • for (i=3;i<=NF;i++) print $1,$2,$i

    これにより、列 3 以降のすべての列から始まり、ループが実行され、列 1 と列 2 の前の行に印刷されます。

答え2

awk '{print $1,$2,$3}$4{print $1,$2,$4}'

==

awk '{print $1,$2,$3;$3="\b"}$4'

または

awk -v OFS="\t" '$4{$4="\n"$1"\t"$2"\t"$4}1'

==

awk -v OFS="\t" '$4{sub("^","\n"$1"\t"$2"\t",$4)}1'

フォーマットされた出力が必要な場合は、OFS変数を使用するか、次のように-v OFS='\t'出力をパイプすることができます。column -t

関連情報