次の形式のファイルがあります。
a 1 2 3 4
b 7 8
c 120
私はそれを次のように解析したいと思います:
a 10
b 15
c 120
これはawkで簡単に実行できることは知っていますが、構文に精通しておらず、機能させることができません。
助けてくれてありがとう
簡単な awk 入門書:
awk '{ for (i=2;i<=NF;i++) { total+=$i }; print $1,total; total=0 }' file
NF は、各行でリセットされる内部変数であり、その行のフィールド数に等しいので、
for (i=2;i<=NF;i++) は、2 から始まる for ループを開始します。
total+=$i は、var total に i 番目のフィールドの値が追加されていることを意味します。上記のループの繰り返しごとに実行されます。
print $1,total は、最初のフィールドに続いて OFS 変数の内容 (デフォルトではスペース)、その行の合計を出力します。
total=0 は、次の反復に備えて合計変数をリセットします。
上記のすべてが入力の各行で行われます。
詳細については、こちらのグリモワールの紹介を参照してください
列 2 から始めて、それらを追加します。
awk '{tot=0; for(i=2;i<$NF;i++) tot+=$i; print $1, tot;}' file
純粋な bash ソリューション:
$ while read f1 f2
> do
> echo $f1 $((${f2// /+}))
> done < file
実行すると、次のようになりました。
a 10
b 15
c 120
最初のフィールドは variable に読み込まれf1
、残りのフィールドは if2
です。variablef2
では、スペースはその場で置き換えられて+
評価されます。
サブシェル、位置パラメータ、および IFS を使用するトリッキーな方法を次に示します。フィールド間のさまざまな量の空白で動作します。
while read label numbers; do
echo $label $(set -- $numbers; IFS=+; bc <<< "$*")
done < filename
これが機能するのは、シェルが( documentation )"$*"
の最初の文字で結合された位置パラメーターの単一の文字列に展開されるためです。$IFS