特定のファイルにAWKを使用して、特定のパターンを含む列を印刷します。

特定のファイルにAWKを使用して、特定のパターンを含む列を印刷します。

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

関連情報