Unixの列名でtxtファイルの列を選択する方法

Unixの列名でtxtファイルの列を選択する方法

約1000個の列を含む大きなファイルがあります。最初の2つの列は染色体とSNP(単一塩基多型)の位置であり、残りはサンプルです。最初の数行は次のとおりです。

#CHROM  POS    P0431    P432    P433    P434    P435
Chr01   180349  G   G   G   N   G
Chr01   180372  N   N   N   N   A
Chr01   180389  A   N   A   N   N

このデータセットには3つの異なるグループのサンプルがあり、それらを別々に別々のファイルに保存したいと思います。

これは十分なgroup1 IDを持つファイルです。

$ head group1
P0431
P434
P435

したがって、マスターデータからこれらのサンプルを見つけてgroup1.dataとして保存したいと思います。

$ head group1.data
#CHROM  POS    P0431    P434    P435   
Chr01   180349  G   N   G
Chr01   180372  N   N   A
Chr01   180389  A   N   N

答え1

入力区切り文字としてスペース(複数)を想定し、csvcutand csvformatfromを使用します。csvkit

$ csvcut -d' ' -S -c "#CHROM,POS,$(paste -sd, < group1)" group1.data | csvformat -T
#CHROM  POS P0431   P434    P435
Chr01   180349  G   N   G
Chr01   180372  N   N   A
Chr01   180389  A   N   N

答え2

$ cat tst.awk
NR==FNR {
    groups[++numGroups] = $1
    next
}
FNR==1 {
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
}
{
    printf "%s%s%s%s", $1, OFS, $2, OFS
    for (groupNr=1; groupNr<=numGroups; groupNr++) {
        group = groups[groupNr]
        printf "%s%s", $(f[group]), (groupNr<numGroups ? OFS : ORS)
    }
}

$ awk -f tst.awk group1 file
#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N

出力をスペース区切りではなくタブ区切りとして指定するには、スクリプトの上部に行を追加しますBEGIN { OFS="\t" }

出力を視覚的に表形式で表示するには、printfawkでsを使用するか、上記を次のようにパイプしますcolumn

$ awk -f tst.awk group1 file | column -t
#CHROM  POS     P0431  P434  P435
Chr01   180349  G      N     G
Chr01   180372  N      N     A
Chr01   180389  A      N     N

答え3

あなたはこれを行うことができますawk

awk 'NR==1,NR==4 {print $1,$2,$3,$6,$7}' group1 > group1.data

これにより、フィールド1、2、3、6、7の最初の4行だけが印刷され、要求された出力が提供され、ファイルに追加されますgroup1.data

#CHROM POS P0431 P434 P435
Chr01 180349 G N G
Chr01 180372 N N A
Chr01 180389 A N N

よりきれいに見えるようにするには、OFS='\t'次のように区切り記号をタブに設定できます。

awk 'NR==1,NR==4 {print $1,$2,$3,$4,$5}' OFS='\t' group1 > group1.data

出力:

#CHROM  POS     P0431   P434    P435
Chr01   180349  G       N       G
Chr01   180372  N       N       A
Chr01   180389  A       N       N

私は複数のスペース区切り文字、タブ、および2つの組み合わせを使用してテストし、毎回これらの出力を受け取りました。

関連情報