一致後の行の残りを grep する

一致後の行の残りを grep する

次のような構造の 2 行のみを含むファイルがあります。

$ cat /tmp/pwpower.log
000D6F0000D34227, -114.10
000D6F0001A405C4, -130.09

値は私の太陽光発電所の電力値です。負の値は発電を意味します。

grep/sed/awk など、最もスマートな方法で値を抽出する必要があります。両方の値をマイナス記号なしで個別に抽出する必要があります。

私が今やっていることはちょっと馬鹿げているのですが、うまくいきます。皆さんの中にはもっと賢い方法を持っている人も多いと思います :-) もちろん、ここではプラスマイナスの値しか見えません。

最初の値を取得するには:

cat /tmp/pwpower.log |grep -o "\-.*" | head -n 1

2 番目の値を取得するには:

cat /tmp/pwpower.log |grep -o "\-.*" | tail -n1

関連する質問ですが、これらの文字列を取得して変換し、合計を計算できる簡単な方法はありますか?

答え1

すべての値:

$ awk -F '[ -]*' '$0=$NF' /tmp/pwpower.log
114.10
130.09

最初の行の値:

$ awk -F '[ -]*' 'NR==1{print $NF;exit}' /tmp/pwpower.log
114.10

2行目の値:

$ awk -F '[ -]*' 'NR==2{print $NF;exit}' /tmp/pwpower.log
130.09

すべての値の合計:

$ awk -F '[ -]*' '{sum+=$NF} END{print sum}' /tmp/pwpower.log
244.19

答え2

cut2 列目の数字を選択し、paste -sd+合計する一連の数字を作成するために使用できます。bcその後、このツールを使用して計算を行うことができます。

$ cut -d',' -f2 pwpower.log | paste -sd+ | bc
-244.19

使い方

2列目から数字を選択します。

$ cut -d',' -f2 pwpower.log 
 -114.10
 -130.09

+各数字の間に記号を入れて 1 行に再フォーマットします。

$ cut -d',' -f2 pwpower.log | paste -sd+
 -114.10+ -130.09

計算を実行します:

$ cut -d',' -f2 pwpower.log | paste -sd+ | bc
-244.19

絶対値を取得するには:

$ cut -d',' -f2 pwpower.log | sed 's/-//g' | paste -sd+ | bc
244.19

ファイルの形式が保証されている場合は、マイナス記号を省略することpwpower.logができます。cut

$ cut -d'-' -f2 pwpower.log | paste -sd+ | bc
244.19

答え3

KISSアプローチ

$ awk '{print -$2; t+=-$2}; END{print t}' pwpower.log 
114.1
130.09
244.19

答え4

[root@ip-10-186-149-181 ~]# cut -d '-' -f2 /tmp/pwpower.log | paste -sd+ | bc
244.19

これにより、マイナスなしで計算が行われます。

一般的にはcutの方がawkより速いと思います

関連情報