Linux C-Shell中wc管道AWK语句在文件不存在时无法输出0 0的问题
解决文件不存在时
wc+awk脚本输出0 0的问题 问题根源
当目标文件不存在时,wc -lc < "file.csv"会在**标准错误(stderr)输出No such file or directory,但管道|仅传递标准输出(stdout)**的内容。此时awk没有接收到任何输入,完全不会执行你的脚本逻辑(包括else分支),自然无法输出0 0。
解决方案
以下三种方法可实现需求,你可以根据场景选择:
方法1:先判断文件存在性再执行逻辑
最直观的方式,先检查文件是否存在,再分支处理:
if [ -f "file.csv" ]; then wc -lc < "file.csv" | awk '{FileSize = $2 / 1024 / 1024; RecordCount = $1 - 1; print FileSize, RecordCount}' else echo "0 0" fi
[ -f "file.csv" ]用于判断文件是否存在且为普通文件- 文件存在时执行原统计逻辑,不存在直接输出
0 0
方法2:重定向错误输出+处理空输入
保留管道结构,同时丢弃错误信息并处理awk的空输入情况:
wc -lc < "file.csv" 2>/dev/null | awk 'NR>0{ FileSize = $2 / 1024 / 1024; RecordCount = $1 - 1; print FileSize, RecordCount }END{ if(NR==0) print "0 0" }'
2>/dev/null将wc的错误输出丢弃,避免干扰终端输出- awk用
NR>0判断是否有有效输入(文件存在时wc会输出一行结果),无输入则在END块输出0 0
方法3:直接用awk处理文件(推荐)
跳过wc,让awk直接处理文件并捕获不存在的情况:
awk 'END{ if(ERRNO){ print "0 0" }else{ FileSize = stat(ARGV[1], "size") / 1024 / 1024 RecordCount = NR - 1 print FileSize, RecordCount } }' "file.csv" 2>/dev/null
- awk的
ERRNO变量会在文件不存在时被赋值,此时直接输出0 0 stat(ARGV[1], "size")用于获取文件大小(需gawk支持,大部分Linux系统默认是gawk)NR是awk处理的总行数,减1的逻辑和原脚本保持一致
额外注意
原脚本中if($1)的判断存在逻辑瑕疵:如果文件存在但为空,wc -lc会输出0 0,此时$1=0会进入else分支,但空文件的记录数应该是0(原逻辑计算为0-1=-1),建议根据实际需求调整记录数的计算规则。
内容的提问来源于stack exchange,提问作者Marco Somoza
相关产品推荐
相关产品推荐

