在for循环中计算变量并使用awk处理TSV文件遇空输出问题求助
问题分析与修复
你的脚本出现卡住、输出为空的核心问题有两个:
1. Bash中误用print命令
Bash没有内置的print命令,你用的print $A和print $B会导致脚本执行异常——系统会尝试寻找外部print程序,找不到时会卡住或报错,根本没执行到后续的awk逻辑,自然生成空文件。
2. 输出文件被重复覆盖
循环中每次处理TSV文件都重定向到example.tsv,即使脚本正常执行,最终也只会保留最后一个文件的处理结果,还会覆盖之前的内容。
修正后的脚本
for file in *.tsv do # 获取文件行数,用Bash内置的echo输出 declare -i A=$(wc -l < "$file") echo "$A" # 整数除法计算B(若需要浮点数,看下方补充) declare -i B=$A/10 echo "$B" # 处理文件并生成带后缀的新文件,避免覆盖 awk -v B="$B" 'BEGIN { FS = OFS = "\t" } {$2 = $2 / B; print}' "$file" > "${file%.tsv}_modified.tsv" done
关键修改点说明
- 把
print替换为echo:这是Bash的标准输出命令,确保脚本能正常执行到awk步骤。 - 给
$file加双引号"$file":避免文件名包含空格、特殊字符时出错。 - 修改输出文件名:用
${file%.tsv}_modified.tsv生成对应原文件名的新文件,既不破坏原文件,也不会被后续循环覆盖。
补充:如果需要浮点数除法
如果你的A不是10的倍数,需要B为小数(比如A=12时B=1.2),可以去掉declare -i,用awk计算浮点数:
for file in *.tsv do A=$(wc -l < "$file") echo "$A" # 用awk计算浮点数的B B=$(awk -v A="$A" 'BEGIN{print A/10}') echo "$B" awk -v B="$B" 'BEGIN { FS = OFS = "\t" } {$2 = $2 / B; print}' "$file" > "${file%.tsv}_modified.tsv" done
内容的提问来源于stack exchange,提问作者JVGen
相关产品推荐
相关产品推荐

