/!\问题基本上已经解决,请参阅下面我自己的答案,了解更多细节和附属问题/!\
我正在尝试根据特定单词添加两行,但我能找到的只是在某种模式之后添加所有内容: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”,所以我可以添加它们。
答案 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}'
不起作用。
作为一个附属问题,任何人都知道在没有或只有一个变量的情况下实现这种减法吗?