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