使用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