複数のファイルの列を見て、単一のテキストファイルに追加する

複数のファイルの列を見て、単一のテキストファイルに追加する

9つの列を含む50のファイルセットがあります(添付の図に示されている例)。

ここに画像の説明を入力してください。

ファイル名は(1)inputfile_1.assoc.logistic(2)inputfile_2.assoc.logisticなど…です。

1、2、3列の値は50ファイルすべて同じです。

50個のファイル全体で7,8,9列を収集し、以下のように単一の.txtファイルに追加できるようにしたいと思います。フィールドはタブで区切られ、列7、8、9には表示されているとおりにラベルが付けられています。

ここに画像の説明を入力してください。

私はgrepループ(以下を参照)を使用して列を個別に抽出し、テキストファイルとして保存し、.txtファイルをstataにインポートしてマージしましたが、かなり時間がかかりました(700万行以上の行があるため)。そしてIこれにはいくつかの分析が必要でした。

for i in $(seq 1 50); do
    gawk -F" " '{print $2, $7, $8, $9}' inputfile_${i}.assoc.logistic >>/mnt/jw01-aruk-home01/projects/jia_mtx_gwas_2016/common_files/output/imputed_dataset/all_50_mi_datasets/acr30R_vs_acr30NR_combined_coefficients/outputfile_${i}.txt
done

これはより効率的になり、シェルループに組み込むことができますか?

ベストアンサー1

入力データ不足のためテストされていません。

gawk '
    BEGIN {FS = OFS = "\t"}
    BEGINFILE {match(FILENAME, /inputfile_([0-9]+).assoc.logistic/, m)}
    FNR == 1 {
        key = $1 OFS $2 OFS $3
        data[key] = data[key] OFS $7"_"m[1] OFS $8"_"m[1] OFS $9"_"m[1]
        next
    }
    {
        key = $1 OFS $2 OFS $3
        data[key] = data[key] OFS $7 OFS $8 OFS $9
    }
    END {
        for (key in data) {
            print key data[key]
        }
    }
' inputfile_*.assoc.logistic > outputfile

データを出力するためにハッシュキーを繰り返すので、出力はランダムな順序で表示されます。

おすすめ記事