我有一个输入为的文件:
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 变量