200を超える列(複数の列のみが表示されます)を含む入力ファイル(タブ区切り)があります。
col1 col2 col3 col4 col5
ID GPD1431 GPD1632 GPD1253 GPD2353
Group GDS_Treated GDS_Untreated GDS_paired_Treated GDS_paired_Untreated
Measure1 7.6 8.2 9.3 4.2
Measure2 0.32 0.56 0.343 0.423
私が望むのは、処理されていないサンプルまたは最初の列を説明するグループの列のみを取得するように、このデータファイルのサブセットを作成することです。出力ファイルもタブ区切りのファイルであることを望みます。このように:
col1 col3 col5
ID GPD1632 GPD2353
Group GDS_Untreated GDS_paired_Untreated
Measure1 8.2 4.2
Measure2 0.56 0.423
私が今まで持っているのはこれです:
awk -F '\t' '{for(i=1; i<=NF; i++) {if($i ~ /Untreated|untreated/ || i==1) col_array[i]=i}} END {for (val in col_array) {print col_array[val]}}' file > columns_to_print.txt
この出力の結果は次のとおりです。
1
3
7
9
12
43
...
203
col_array の内容を印刷すると、クイック目視検査により、数値が正しい列番号と一致するように見えます。だからこれは良いスタートのようです。ただし、この情報を使用してタブ区切りファイルから目的の列を印刷する方法は混乱しています。
試してみましたが、awk 'NR==FNR{columns[$1]=$1;next}{for(i=1; i<=NF; i++){if(columns[i]>1)print $i}}' columns_to_print.txt file
正しい列が印刷されないようです。 (そして、すべてが1列になるように印刷物のフォーマットが行われました。)
ご協力ありがとうございます。
答え1
awk
このタスクのスクリプトは次のとおりです。
awk -F '\t' 'BEGIN {cols[1]}
pass == 1 && $1 == "Group" {
for (i=2;i<=NF;i++) if ($i ~ /[Uu]ntreated$/) cols[i]
nextfile
}
pass == 2 {
rec = ""
for (i=1;i<=NF;i++) {
if (i in cols) rec = (rec ? rec FS $i : $i)
}
print rec
}' pass=1 file pass=2 file
まず、「Group」で始まる行を検索し、その行のパターンに一致するフィールドの列番号を格納します。最初の解析をすぐに終了します。nextfile
。
2番目のパスでは、に保存されている列のみを印刷しますcols
。すべてのフィールドを繰り返し、変数に印刷される行を設定しますrec
。やはり標準だ条件式ここで使用されています。
テスト出力:
col1 col3 col5
ID GPD1632 GPD2353
Group GDS_Untreated GDS_paired_Untreated
Measure1 8.2 4.2
Measure2 0.56 0.423