列名を抽出してファイル名を出力するために使用

列名を抽出してファイル名を出力するために使用
#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、、、bashzshを使用してください。

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

関連情報