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 

たとえば、配列インデックスがコピーされる順序は(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変数と合計変数をリセットします。

関連情報