来自多个文件的 gawk 列并添加到单个文本文件

来自多个文件的 gawk 列并添加到单个文本文件

我有 50 组文件,包含 9 列(示例如附图所示)。

在此输入图像描述

这些文件被命名为 (1) inputfile_1.assoc.logistic (2) inputfile_2.assoc.logistic 等…。

所有 50 个文件中第 1、2 和 3 列中的值均相同

我希望能够从所有 50 个文件中 grep 列 7,8 和 9 并添加到单个 .txt 文件中,如下所示(字段以制表符分隔,列 7,8 和 9 标记为如图所示)

在此输入图像描述

我一直在使用 grep 循环(如下所示)单独提取列,另存为文本文件,将 .txt 文件导入到 stata 中以合并它们,但这需要相当长的时间(因为我有超过 700 万行),我需要对此进行了多次分析。

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

这可以变得更有效并合并到 shell 循环中吗?

答案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

由于我正在迭代哈希键来输出数据,因此输出将以随机顺序出现

相关内容