Shell脚本中的Sum值

时间:2017-03-21 10:05:02

标签: bash shell

我在文件中使用以下格式的值:

Filevalue.txt

ABC
123个
开发
456个
HIJ
567个
123个
542

我需要从低于它的字符值中添加数值

输出

abc 123
dev 456
hij 1232

Anyhelp会深表感激吗?

2 个答案:

答案 0 :(得分:2)

这是保留命令的另一个awk

示例

$ awk '/[0-9]+/{a+=$1;next}a{print a;a=0}{printf($1FS);a=0}END{print a}' file
abc 123
dev 456
hij 1232

<强>解释

/[0-9]+/{a+=$1;next}:当号码检测到作为记录的内容时,它的值会累积到a var,然后{{ 1}}用于停止进一步处理并将流传递到 next 记录。

next当计数器不为空时,我们会打印与前一个对应的a{print a;a=0}值并初始化它。

a:打印当前记录和分隔符,避免回车。这适用于所有文本记录。

{printf($1FS);a=0}:显示最后一条记录后将保留的最终计数器。

答案 1 :(得分:1)

可以使用awk and arrays

来完成此操作
$ awk '{if($1!~/^[0-9]+$/){cur=$1}else{sums[cur]+=$1}}END{for(el in sums){printf("%s %d\n",el,sums[el])}}' Filevalue.txt 
hij 1232
dev 456
abc 123

以下是相同的代码,但写入文件sum.awk并附带注释:

# this block will be executed for every line in the file
{
    # if current processing line is not a number, then it's a name of the next
    # group, let's save it to cur variable
    if ($1 !~ /^[0-9]+$/) {
        cur = $1
    } else {
        # here we're summing values
        sums[cur] += $1
    }
}
# this block will be executed at the end of file processing, here we're
# printing array with sums
END {
    for (el in sums) {
        printf("%s %d\n", el, sums[el])
    }
}

像这样使用:

$ awk -f sum.awk Filevalue.txt 
hij 1232
dev 456
abc 123

这里使用awk的唯一缺点是它不会保留键顺序。