2

次の形式のファイルがあります。

a 1 2 3 4
b 7 8
c 120

私はそれを次のように解析したいと思います:

a 10
b 15
c 120

これはawkで簡単に実行できることは知っていますが、構文に精通しておらず、機能させることができません。

助けてくれてありがとう

4

4 に答える 4

5

簡単な 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 は、次の反復に備えて合計変数をリセットします。

上記のすべてが入力の各行で行われます。

詳細については、こちらのグリモワールの紹介を参照してください

于 2013-01-18T11:10:48.423 に答える
3

列 2 から始めて、それらを追加します。

 awk '{tot=0; for(i=2;i<$NF;i++) tot+=$i; print $1, tot;}' file
于 2013-01-18T11:05:09.360 に答える
3

純粋な bash ソリューション:

$ while read f1 f2
> do
>   echo $f1 $((${f2// /+}))
> done < file

実行すると、次のようになりました。

a 10
b 15
c 120

最初のフィールドは variable に読み込まれf1、残りのフィールドは if2です。variablef2では、スペースはその場で置き換えられて+評価されます。

于 2013-01-18T11:11:45.810 に答える
0

サブシェル、位置パラメータ、および IFS を使用するトリッキーな方法を次に示します。フィールド間のさまざまな量の空白で動作します。

while read label numbers; do 
    echo $label $(set -- $numbers; IFS=+; bc <<< "$*")
done < filename

これが機能するのは、シェルが( documentation )"$*"の最初の文字で結合された位置パラメーターの単一の文字列に展開されるためです。$IFS

于 2013-01-18T20:55:05.680 に答える