如何用awk选择两个特定的行?

时间:2018-01-30 11:38:48

标签: bash awk

/!\问题基本上已经解决,请参阅下面我自己的答案,了解更多细节和附属问题/!\

我正在尝试根据特定单词添加两行,但我能找到的只是在某种模式之后添加所有内容:How to select lines between two marker patterns which may occur multiple times with awk/sed

这不是我正在照顾的。

考虑以下输出:

aji 1
bsk 2
cmq 3
doh 4
enr 5
fwp 6
gzx 7

我想要的是像cmq + fwp,输出应该是:

9

我知道如何添加值,但我错过了select line containing cmq, then select line containing fwp部分。

那么,有没有办法让awk可以独立地严格选择两条特定的行(然后添加它们)?

编辑:

据我所知,匹配的单词是awk '/cmq/',但是我需要这样做才能说“fwp”,所以我可以添加它们。

2 个答案:

答案 0 :(得分:6)

$ awk '$1 ~ /^(cmq|fwp)$/{sum+=$2} END { print sum}'  infile

<强>解释

awk '$1 ~ /^(cmq|fwp)$/{     # look for the match in first field
       sum+=$2               # sum up 2nd field ($2) value,where sum is variable
     }
     END{                    # at the end
       print sum             # print variable sum
     }' infile

测试结果:

$ cat infile
aji 1
bsk 2
cmq 3
doh 4
enr 5
fwp 6
gzx 7

$ awk '$1 ~ /^(cmq|fwp)$/{sum+=$2} END { print sum}'  infile
9

答案 1 :(得分:0)

现在,这次更通用的方式 - 甚至可以减去 - :

awk '/cmq/{x=$2} /fwp/{y=$2} END {print x+y}'

其中:

awk '          # Invoking awk and its instructions
/cmq/{x=$2}    # Select line with "cmq", then set its value to x. Both must be tied
/fwp/{y=$2}    # Select line with "fwp", then set its value to y. Both must be tied
END            # Ends pattern matching/creation
{print x+y}    # Print the calculated result
'              # Ending awk's instructions

不幸的是,使用了两个变量(x和y)。

所以,我仍然有兴趣找到没有任何变量的方法,或者最多只有一个。

我确实有一种单变量的求和方式:

awk '/cmq|fwp/ {x+=$2} END {print x}'

但这样做可以减去:

awk '/cmq|fwp/ {x-=$2} END {print x}'

不起作用。

作为一个附属问题,任何人都知道在没有或只有一个变量的情况下实现这种减法吗?