UNIX:统计多个带表头文件总行数时仅减一个表头的问题排查
问题分析与解决方法
你的两个命令为啥出错?
sed '1d' IN-Pass-30* | wc -l:sed默认会把所有输入文件当成一个连续的数据流处理,1d只会删除整个流的第一行(也就是第一个文件的表头),其他文件的表头根本没被删掉,所以统计结果只少了一行。awk 'END {print NR-1}' IN-Pass-30*:NR是所有文件的总行数总和,你只减了1,但每个文件都有一个表头,实际要减去的是文件的总数,不是1,结果自然不对。
正确的命令写法
方法1:用sed处理每个文件的第一行
加上-s参数(让sed把每个文件当作独立输入),这样每个文件的第一行都会被删除:
sed -s '1d' IN-Pass-30* | wc -l
方法2:用awk精确计数
用FNR(当前处理文件的行号)判断,只统计每个文件从第二行开始的内容:
awk 'FNR > 1 {count++} END {print count}' IN-Pass-30*
或者直接用总行数减去文件个数(ARGC-1是文件的数量,因为ARGC包含awk命令本身):
awk 'END {print NR - (ARGC - 1)}' IN-Pass-30*
内容的提问来源于stack exchange,提问作者noob
相关产品推荐
相关产品推荐

