使用bash或awk从n个后续行添加数字

时间:2016-05-28 18:24:05

标签: bash awk

我有一个文件:

foobar 4
barfoo 3
forabo 2
afoorb 5

我想在n行的第二行添加数字。 如果n = 2,结果看起来像

barfoo 7
forabo 5
afoorb 7

我该怎么做?

2 个答案:

答案 0 :(得分:1)

对于适用于任何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 }
'

答案 1 :(得分:0)

这是我的版本 - 可能不是最好的,但我很乐意尝试解决这个问题:

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