シェルを使用して区切り文字に基づいて複数の列を行に分割する

シェルを使用して区切り文字に基づいて複数の列を行に分割する

次のようにタブ区切りのファイルがあります。

cg13201342  F   ARNT;ARNT;ARNT;CTSK 3'UTR;3'UTR;3'UTR;TSS1500
cg05269359  F   SCN4B;SCN4B;SCN4B;SCN4B 3'UTR;3'UTR;3'UTR;Body
cg06018296  R   NEK3;NEK3;NEK3;NEK3 3'UTR;3'UTR;3'UTR;Body
cg05172994  F   WDR20;WDR20;WDR20;WDR20 3'UTR;3'UTR;3'UTR;Body

希望の出力:

cg13201342  F   ARNT   3'UTR
cg13201342  F   ARNT   3'UTR
cg13201342  F   ARNT   3'UTR
cg13201342  F   CTSK   TSS1500
cg05269359  F   SCN4B  3'UTR
.
.

など。

頑張った

awk 'BEGIN {
       FS = OFS = "\t"
     }
     {
       n = split($3, f, " *;*")
       for (i=1; i<=n; i++)
         print $1, f[i]
     }' probe-genes-regions >chk

ただし、これは3番目の列のみを分割します。最後の列を2番目の列から分離し、3番目の列の最初のフィールドと最後の列の1番目のフィールドなどで別々の行を形成したいと思います。

ベストアンサー1

たとえば、フィールド3と4をセミコロンを使用して別々の配列に分割して繰り返します(フィールド3と4の要素数が同じであると仮定)。

解析.awk

BEGIN { OFS = "\t" }

{ 
  n = split($3, a, /;/); split($4, b, /;/)
  for(i=1; i<=n; i++)
    print $1, $2, a[i], b[i] 
}

次のように実行します。

awk -f parse.awk infile

出力:

cg13201342      F       ARNT    3'UTR
cg13201342      F       ARNT    3'UTR
cg13201342      F       ARNT    3'UTR
cg13201342      F       CTSK    TSS1500
cg05269359      F       SCN4B   3'UTR
cg05269359      F       SCN4B   3'UTR
cg05269359      F       SCN4B   3'UTR
cg05269359      F       SCN4B   Body
cg06018296      R       NEK3    3'UTR
cg06018296      R       NEK3    3'UTR
cg06018296      R       NEK3    3'UTR
cg06018296      R       NEK3    Body
cg05172994      F       WDR20   3'UTR
cg05172994      F       WDR20   3'UTR
cg05172994      F       WDR20   3'UTR
cg05172994      F       WDR20   Body

おすすめ記事