awkまたはsedを使用して列内で算術演算を実行する

awkまたはsedを使用して列内で算術演算を実行する

算術結果に統合したい単純な算術方程式を含む列を持つファイルがあります。

入力サンプル(タブで区切られた列):

+104-1+12   6   +3

各列内の算術合計を計算したいと思います。列に算術記号が含まれていない場合は、+項目の前に が含まれているかのように処理されます。+列がunsignedで始まる場合、sedを介してシンボルを追加するのは簡単ですが(sed -E 's/(\t)([0-9]*)/\1\t+\2/g'例のように行が数字で始まらないと仮定すると機能します)

私の予想結果は次のとおりです。

115 6   3

Unixでどのようにこれを達成できますか? awk/sed ソリューションが推奨されます。

ベストアンサー1

あなたが使用できるperl

perl -pe 's/[\d+-]+/eval$&/ge' your-file

でも:

perl -pe 's/[\d+-]+/$&/gee' ファイル(Rakesh に感謝)

zsh同じ

set -o extendedglob # for the ## operator (same as ERE +)
while IFS= read -r line; do 
  printf '%s\n' ${line//(#m)[0-9+-]##/$((MATCH))}
done < your-file

または:

zmodload zsh/mapfile
set -o extendedglob
printf %s ${mapfile[your-file]//(#m)[0-9+-]##/$((MATCH))}

-これらの4つのうち、数字と文字のシーケンスを探し、+それをインタプリタの算術プロセッサ(evalin perl(またはee代替拡張をperlコードとして評価するフラグ)、$((...))in zsh)に渡します。

式をインタプリタに渡す前に検証しないため、エラーが発生する可能性があります(たとえば、-+-同じシーケンスで3++)。ただし、少なくとも数字と-/+文字のみが考慮されるため、報告されたエラーよりも多くのエラーは発生しません。メッセージを送信してコマンドを中断します。

おすすめ記事