次の入力を含むファイルがあります。
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
たとえば、配列インデックスがコピーされる順序は(s in SUM)
定義されていません。発生順に出力が必要な場合は、追加(簡単)測定が必要です。
答え2
最後に改行なしで各アルファ行を印刷し、その後にすべての数字を追加して合計と改行を印刷します。
$ 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変数と合計変数をリセットします。