AWK:有一些标志可以忽略评论吗?

hhh*_*hhh 5 awk comments

注释行在NR中计算.

  1. 是否有一些标志可以忽略评论?
  2. 如何限制AWK中的范围,而不是像管道一样| 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)

Cas*_*bel 6

只需在注释行中减少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块.我的想法是,当你对匹配的记录有更复杂的动作时,这看起来更清晰,但对于这么简单的事情并不重要.带上你最喜欢的!

  • 将第一条规则更改为: /^[[:space:]]*#/ { NR--; 下一个; } 下一个;' 跳到下一条记录并忽略其余代码。恕我直言,比使用 IF 更容易。 (2认同)

gho*_*g74 6

最好不要触摸NR,使用不同的变量来计算行数.此版本会跳过注释以及空白行.

$ awk '!/^[ \t]*#/&&NF{sum+=$3;++d}END{ave=sum/d;print ave}' file
0.97404
Run Code Online (Sandbox Code Playgroud)