awk输出异常排查:输入仅一次的最后一行重复出现
问题根源与解决方案
咱们一步步拆解问题,找到重复行的原因并解决:
你的awk命令逻辑是遍历file2的每一行,每次从file1读取一行并拼接打印,这会带来两个关键问题:
- 只有file1的前N行(N等于file2的行数)会被处理;
- 如果file2的行数比file1多,当file1被读完后,
getline会持续返回0,此时变量f1会固定为file1最后一行的内容(也就是你看到的“No Additional CNV Detected”),然后重复打印这一行直到file2处理完毕——这就是重复行的直接诱因。
根据你的需求(把file2的指定字段追加到file1每一行末尾),正确的做法是先把file2的目标字段预读到变量中,再遍历file1的每一行进行拼接,而不是交叉读取两个文件。
正确的awk命令实现
场景1:仅追加file2的数据行字段(推荐)
如果只需要file2里的数值数据(第二行的2353、1、99.9575)追加到file1每一行后面:
BEGIN { # 读取file2,提取第二行的三个字段存入变量 while (getline < "file2") { if (NR == 2) { total_targets = $1 low_cov_targets = $2 high_cov_pct = $3 } } close("file2") # 关闭文件,避免资源泄漏 } # 遍历file1的每一行,拼接变量后输出 { print $0, total_targets, low_cov_targets, high_cov_pct } OFS="\t"
把上述代码保存为script.awk,执行命令:
awk -f script.awk file1 > out
或者写成单行命令更便捷:
awk 'BEGIN{while(getline <"file2"){if(NR==2){t1=$1;t2=$2;t3=$3}};close("file2")} {print $0,t1,t2,t3}' OFS="\t" file1 > out
场景2:需要追加file2的完整内容到file1末尾
如果你的需求是把file2的所有内容(表头+数据)直接追加到file1最后一行之后,不需要和file1每行拼接,直接用cat更简单高效:
cat file1 file2 > out
关于END块的疑问
你不需要添加END块,因为END块是在所有输入处理完成后执行的收尾操作,你的需求不需要在最后执行额外逻辑。问题的核心是调整文件读取的顺序和逻辑,而非依赖END块。
内容的提问来源于stack exchange,提问作者justaguy
相关产品推荐
相关产品推荐

