使用bash或awk从n个后续行添加数字
我有一个文件:使用bash或awk从n个后续行添加数字,bash,awk,Bash,Awk,我有一个文件: foobar 4 barfoo 3 forabo 2 afoorb 5 我想把n行中第二行的数字相加。 如果n=2,结果如下 barfoo 7 forabo 5 afoorb 7 如何做到这一点?对于适用于任何n的通用解决方案, 可以使用行号作为索引将值保存在数组中, 并在使用后删除值。 有点像排队 awk -v n=2 ' NR >= n { print $1, ($2 + q[NR - n + 1]); delete q[NR - n + 1];
foobar 4
barfoo 3
forabo 2
afoorb 5
我想把n行中第二行的数字相加。
如果n=2,结果如下
barfoo 7
forabo 5
afoorb 7
如何做到这一点?对于适用于任何
n
的通用解决方案,
可以使用行号作为索引将值保存在数组中,
并在使用后删除值。
有点像排队
awk -v n=2 '
NR >= n {
print $1, ($2 + q[NR - n + 1]);
delete q[NR - n + 1];
}
{ q[NR] = $2 }
'
经过一些澄清之后,似乎您需要值的总和,
例如,对于n=3
,预期输出:
forabo 9
afoorb 10
在这种情况下:
awk -v n=2 '
NR >= n {
idx = NR - n + 1;
sum = 0;
for (i = 0; i < n - 1; i++) sum += q[idx + i];
print $1, $2 + sum;
delete q[idx];
}
{ q[NR] = $2 }
'
awk-vn=2'
NR>=n{
idx=NR-n+1;
总和=0;
对于(i=0;i
这是一个我的版本-可能不是最好的,但我很高兴尝试解决这个问题:
echo Here goes nothing
rowCnt=2
declare -i numOfLines
declare -i x2
declare -i tot
declare -i y2
declare -i j
numOfLines=$(wc -l < lines.txt)
for ((c=1; c<=$numOfLines; c++))
do
line=`sed -n ${c}p lines.txt`
read -r x1 x2 <<< "$line"
if (($c >= $rowCnt))
then
tot=0
for ((j=$c-$rowCnt+1; j<=$c; j++))
do
seek=`sed -n ${j}p lines.txt`
read -r y1 y2 <<< "$seek"
tot=$tot+$y2
done
echo "$x1" "$tot"
fi
done
echo这里什么都没有
rowCnt=2
声明-i numOfLines
声明-i x2
申报-我是托特
申报-i y2
声明-i j
numOfLines=$(wc-l 对于((c=1;c@kernash我修改了我的答案,如果它仍然不是您想要的,请告诉我,并解释8从何而来forabo8