注释行在NR中计算。
| sed -e '1d'
那样忽略注释行?示例
$ awk '{sum+=$3} END {avg=sum/NR} END {print avg}' coriolis_data
0.885491 // WRONG divided by 11, should be by 10
$ cat coriolis_data
#d-err-t-err-d2-err
.105 0.005 0.9766 0.0001 0.595 0.005
.095 0.005 0.9963 0.0001 0.595 0.005
.115 0.005 0.9687 0.0001 0.595 0.005
.105 0.005 0.9693 0.0001 0.595 0.005
.095 0.005 0.9798 0.0001 0.595 0.005
.105 0.005 0.9798 0.0001 0.595 0.005
.095 0.005 0.9711 0.0001 0.595 0.005
.110 0.005 0.9640 0.0001 0.595 0.005
.105 0.005 0.9704 0.0001 0.595 0.005
.090 0.005 0.9644 0.0001 0.595 0.005
答案 0 :(得分:6)
在评论专栏上自行减少NR:
awk '/^[[:space:]]*#/ { NR-- } {sum+=$3} END { ... }' coriolis_data
好的,这确实回答了你问的问题,但你真正想要的问题是:
awk '{ if ($0 ~ /^[[:space:]]*#/) {NR--} else {sum+=$3} END { ... }' coriolis_data
(在第一个答案中使用模块之外的模式更麻烦,但要这样做,你必须两次编写评论模式。)
编辑:将使用/.../ {NR--; next}
在评论中建议避免使用if-else块。我的想法是,当你对匹配的记录有更复杂的动作时,这看起来更清晰,但对于这么简单的事情并不重要。带上你最喜欢的!
答案 1 :(得分:6)
最好不要触摸NR
,使用不同的变量来计算行数。此版本会跳过评论和空白行。
$ awk '!/^[ \t]*#/&&NF{sum+=$3;++d}END{ave=sum/d;print ave}' file
0.97404
答案 2 :(得分:3)
另一种方法是使用条件语句......
awk '{ if( $1 != "#" ){ print $0 } }' coriolis_data
这样做是告诉awk
跳过第一个条目为#
的行。当然,这需要评论charactter #
独立于评论的开头。
答案 3 :(得分:2)
您为AWK提供解析的文件不是源文件,而是数据,因此,AWK对其配置一无所知。换句话说,对于AWK,以#开头的行没什么特别的。
那说,当然你可以跳过评论,但你必须为此创建一个逻辑:告诉AWK忽略“#”之后的所有内容并自己计算行数。
awk 'BEGIN {lines=0} {if(substr($1, 0, 1) != "#") {sum+=$3; lines++} } END {avg=sum/lines} END {print avg}' coriolis_data
当然,您可以缩进它以获得更好的可读性。
答案 4 :(得分:0)
我先用sed删除它们,然后用grep删除空行。
sed 's/#.*//' < coriolis_data | egrep -v '^$' | awk ...
答案 5 :(得分:0)
有一种SIMPLER方法可以做到!
$ awk '!/#/ {print $0}' coriolis_data
.105 0.005 0.9766 0.0001 0.595 0.005
.095 0.005 0.9963 0.0001 0.595 0.005
.115 0.005 0.9687 0.0001 0.595 0.005
.105 0.005 0.9693 0.0001 0.595 0.005
.095 0.005 0.9798 0.0001 0.595 0.005
.105 0.005 0.9798 0.0001 0.595 0.005
.095 0.005 0.9711 0.0001 0.595 0.005
.110 0.005 0.9640 0.0001 0.595 0.005
.105 0.005 0.9704 0.0001 0.595 0.005
.090 0.005 0.9644 0.0001 0.595 0.005
更正:不,不是!
$ awk '!/#/ {sum+=$3}END{ave=sum/NR}END{print ave}' coriolis_data
0.885491 // WRONG.
$ awk '{if ($0 ~ /^[[:space:]]*#/){NR--}else{sum+=$3}}END{ave=sum/NR}END{print ave}' coriolis_data
0.97404 // RIGHT.