注释行在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
Run Code Online (Sandbox Code Playgroud)
只需在注释行中减少NR:
awk '/^[[:space:]]*#/ { NR-- } {sum+=$3} END { ... }' coriolis_data
Run Code Online (Sandbox Code Playgroud)
好的,这确实回答了你问的问题,但你真正的意思是:
awk '{ if ($0 ~ /^[[:space:]]*#/) {NR--} else {sum+=$3} END { ... }' coriolis_data
Run Code Online (Sandbox Code Playgroud)
(在第一个答案中,使用块外部的模式更加令人惊讶,但要这样做,您必须两次编写评论模式.)
编辑:将在评论中建议使用/.../ {NR--; next}以避免使用if-else块.我的想法是,当你对匹配的记录有更复杂的动作时,这看起来更清晰,但对于这么简单的事情并不重要.带上你最喜欢的!
最好不要触摸NR,使用不同的变量来计算行数.此版本会跳过注释以及空白行.
$ awk '!/^[ \t]*#/&&NF{sum+=$3;++d}END{ave=sum/d;print ave}' file
0.97404
Run Code Online (Sandbox Code Playgroud)