awk脚本无法打印文件名求排查:批量统计指定文件列数
问题分析与修正
你的代码核心问题是awk变量引用错误:
- 你通过
-v var="$name"将shell中的name变量传递给了awk的var变量,但在awk的打印语句里却使用了未定义的name变量,自然无法输出文件名。
修正后的基础版本
for file in $(find ./ -name "*_intersect.txt") do name=$(basename "$file") awk -v var="$name" '{print var, NF; exit}' "$file" done
这里做了两处关键调整:
- 将awk打印语句中的
name改为var,对应你传递的变量名 - 给
$file和$name加上双引号,避免文件名包含空格、特殊字符时出现解析错误
更简洁的优化写法
可以省去shell循环中的basename步骤,直接让awk通过内置的FILENAME变量获取文件名,再用字符串处理去掉路径:
find ./ -name "*_intersect.txt" -exec awk '{print gensub(/.*\//,"",1,FILENAME), NF; exit}' {} \;
或者用find结合sh -c来处理文件名:
find ./ -name "*_intersect.txt" -exec sh -c ' fname=$(basename "$1") awk -v fn="$fname" "{print fn, NF; exit}" "$1" ' _ {} \;
这几种写法都能实现你预期的输出效果,比如:
file1 4 file2 8 file3 5
内容的提问来源于stack exchange,提问作者zzz
相关产品推荐
相关产品推荐

