我在文件中使用以下格式的值:
ABC
123个
开发
456个
HIJ
567个
123个
542
我需要从低于它的字符值中添加数值
abc 123
dev 456
hij 1232
Anyhelp会深表感激吗?
答案 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的唯一缺点是它不会保留键顺序。