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

时间:2010-04-21 22:33:22

标签: comments awk

注释行在NR中计算。

  1. 是否有一些标志可以忽略评论?
  2. 如何限制AWK中的范围,而不是像管道| sed -e '1d'那样忽略注释行?
  3. 示例

    $ 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
    

6 个答案:

答案 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.
相关问题