#chr fivep threep strand sample1 sample2 sample3 sample4 name1 name2
chrI 9442 9492 + 0 0 0 0 na na
chrI 12584 12631 + 0 0 0 0 na na
chrI 12584 12679 + 16 16 15 22 na na
chrI 12584 12727 + 0 0 0 0 na na
chrI 12632 12679 + 13 12 16 9 na na
上記の形式のファイルがあります。デフォルトでは、サンプル1、サンプル2などの列である出力名で4つの別々のファイルを取得できるように出力が必要です。
たとえば、私がしたいことは次のとおりです。
awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$5,$4}' > sample1.txt
awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$6,$4}' > sample2.txt
awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$7,$4}' > sample3.txt
awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$8,$4}' > sample4.txt
いくつかの列に対してこれを実行できますが、多くの列を含む大容量ファイルがあります。各awkステートメントを個別に入力する必要がないようにループでこれを行う方法
答え1
forループ(ksh93
、、、bash
)zsh
を使用してください。
for ((i=5;i<=8;i++)); do
awk -v i="$i" -v OFS="\t" 'NR==1{fname=$i".txt"}{print $1,$2,$3,$9":"$10,$i,$4 > fname}' infile
done
開始フィールドと終了フィールドはループにありますfor
。出力ファイル名は、サフィックスが追加されたヘッダー行から抽出され、.txt
リダイレクトはawk
。