文字を繰り返して、列の項目を一意の文字数だけ列に分割します。

文字を繰り返して、列の項目を一意の文字数だけ列に分割します。

だから、次のファイルがあります。

  • file1: 3列

    SNP Id Geno
    1 a AB
    2 a AB
    3 a BB
    . . .
    . . .
    . . .
    1 b AB
    2 b BB
    3 b AB
    . . .
    . . .
    . . .
    1 c AA
    2 c AB
    3 c AA
    . . .
    . . .
    . . .
    

次のファイルが必要です。

  • file2:遺伝子型を持つIDの数だけ

    SNP Genoa Genob Genoc . . .
    1 AB AB AA
    2 AB BB AB
    3 BB AB AA
    . . . .
    . . . .
    . . . .
    

ベストアンサー1

このスクリプトは簡潔でも読みやすくもありませんが、機能し、既に公開されているソリューションとは異なり、awkヘッダー行も生成します。

sed 'G;s/^SNP.*/SNP/
/^1 /s/ \([^ ]*\) .*SNP[^[:cntrl:]]*/& Geno\1/
s/^\([0-9]*\) [^ ]*\( [AB]*\)\n\(.*\n\1 [AB ]*\)/\3\2/
s/^\([0-9]*\) [^ ]*\( [AB]*\)\(\n\)\(.*\)/\4\3\1\2/
h
$!d' file1 > file2

ユーザーでない場合は、次のように指定されたソリューションを拡張してヘッダー行を生成することもawkできます。awk

awk '{if ($1==1) h=h" Geno"$2
if ($1!="SNP") g[$1]=g[$1]" "$3}
END {print "SNP"h; for (i in g) print i g[i]}' file1 > file2

おすすめ記事