awk 仅对字符串后的所有数字求和

awk 仅对字符串后的所有数字求和

我有一个输入为的文件:

abc
def
ghi
23
54
12
tuy
12
iuy
56
67

我想在字符行后面添加所有数字并将其打印在字符前面,如下所示:

abc
def
ghi 89
tuy 12
iuy 123

任何人都可以帮忙吗?

答案1

使用数组保存所有总和,然后在 END 部分将它们打印出来,但抑制零总和:

awk '/^[^0-9]/ {IX = $0} {SUM[IX] += $0} END {for (s in SUM) print s, SUM[s]?SUM[s]:""}' file
abc 
ghi 89
iuy 123
tuy 12
def 

请注意,在eg 中复制数组索引的顺序(s in SUM)是未定义的;如果您需要按发生顺序输出,则需要采取附加(简单)措施。

答案2

打印每个 alpha 行,末尾不带换行符,然后在将其后面的所有数字相加后打印总和加上换行符:

$ awk '
    /[[:alpha:]]/ { printf "%s%s%s%s", ofs, sum, ors, $0; sum=ofs=""; ors=ORS; next }
    { ofs=OFS; sum+=$0 }
    END { print ofs sum }
' file
abc
def
ghi 89
tuy 12
iuy 123

答案3

$ awk 'NR==1{val=$0;next}$0~/^[0-9]*/{sum+=$0}/^[^0-9]/{print val,sum;val=$0;sum=0}END{print val,sum}' a.txt
abc 0
def 0
ghi 89
tuy 12
iuy 123

NR==1{val=$0;next}---> 当读取第一行时,将值保留在 val 变量中并读取下一行。

$0~/^[0-9]*/{sum+=$0}--> 如果是数字,则将其相加。

/^[^0-9]/{print val,sum;val=$0;sum=0}--> 如果它不是数字,则只需打印行和总和并重置 val 和 sum 变量

相关内容