
約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
入力区切り文字としてスペース(複数)を想定し、csvcut
and csvformat
fromを使用します。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" }
。
出力を視覚的に表形式で表示するには、printf
awkで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つの組み合わせを使用してテストし、毎回これらの出力を受け取りました。