我有一堆文件(总共 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...