如果在多个文件中看到条件,如何将特定列打印到文件中?

如果在多个文件中看到条件,如何将特定列打印到文件中?

我有一堆文件(总共 2181 个文件;anacovis2_1_summary_betai_reg.out~ anacovis2_2181_summary_betai_reg.out),如下所示:

anacovis2_2_summary_betai_reg.out
anacovis2_3_summary_betai_reg.out
anacovis2_4_summary_betai_reg.out
anacovis2_5_summary_betai_reg.out
anacovis2_6_summary_betai_reg.out
anacovis2_7_summary_betai_reg.out
.
.
.
anacovis2_2179_summary_betai_reg.out
anacovis2_2180_summary_betai_reg.out
anacovis2_2181_summary_betai_reg.out

每个文件如下所示:

 COVARIABLE MRK M_Pearson SD_Pearson BF(dB) Beta_is SD_Beta_is eBPis
  1       1    -0.00974041     0.21914544   -10.86437924    -0.00058189     0.00694111     0.03003007
  1       2     0.08603974     0.19711939    -1.27963044     0.00381909     0.00953539     0.16192245
  1       3    -0.02912035     0.20260353   -12.60498743    -0.00146066     0.00633105     0.08749265

我想遍历每个文件(1 到 2181),如果第一列(COVARIABLE)等于“1”,则仅打印最后一列并将其保存在单独的文件中(我想将每个文件的输出保存在单独的文件)。

我该如何做到这一点awk或有其他建议?

答案1

这应该可以通过 only 轻松完成awk

awk '($1==1){print $NF>FILENAME"_new"}' anacovis2_{1..2181}_summary_betai_reg.out

这将检查第一列是否等于 1,$1==1然后将最后一列打印$NF到具有相同 FILENAME 格式但以 结尾的新文件中_new,因此输出文件将为FILENAME_new.

为了读取所有 2181 个文件,我们使用大括号扩展参数这里。

答案2

简单的解决方案是:

for((i=1;i<2182;i++)); do
    file_in="anacovis2_${i}_summary_betai_reg.out"
    file_out="awk_output_${i}"
    awk '$1==1 { print $NF }' "$file_in" >"$file_out"
done

一种更快的解决方案可能是打开输入和输出文件,awk这样只awk需要一个进程而不是 2181...

相关内容