web-dev-qa-db-ja.com

行の残りのグレップ.....試合後

次の構造を持つ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

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

8
njordan

すべての値:

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

1行目の値:

$ 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
12

cutを使用して、数値の2列目を選択し、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
8
slm

A KISSアプローチ

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

私はあなたのgrepコマンドが好きですが、マイナス記号を削除して、マイナス記号がない場合に機能するように改善することができます。 GNU grepで-Eフラグを指定して使用できる拡張正規表現を使用すると、数値をより正確に照合できます。

Catを使用しない方が少し効率的ですが、ファイル名を引数として最初のコマンドに渡して、ファイルを読み取らせます。また、ファイルの最初または最後の行だけを処理している場合は、最初にheadまたはtailコマンドを使用して、 grepを含む1行。

最初の値:

$ head -n 1 /tmp/pwpower.log | grep -oE '[0-9\.]+$' 
114.10

最後の値:

$ tail -n 1 /tmp/pwpower.log | grep -oE '[0-9\.]+$'
130.09

合計( ここ からのawkコマンドを使用):

$ grep -oE '[0-9\.]+$' /tmp/pwpower.log | awk '{s+=$1} END {print s}'
244.19
4
[root@ip-10-186-149-181 ~]# cut -d '-' -f2 /tmp/pwpower.log | paste -sd+ | bc
244.19

これはマイナスなしで計算を行います。

カットは一般的にawkより速いと思います

3
csny

awkは適切なツールですが、おそらく数値はcanは正の値(右?)です。つまり、notはマイナス記号をフィールドセパレータ。代わりに、フィールドの区切り文字としてカンマを使用し、各値を数値で否定します。awkは、文字列を自動的に数値に変換します。

$ awk -F, '{ print -$2 }' < /tmp/pwpower.log
114.1
130.09

正の数がある場合は、負の数になります。合計だけが必要な場合は、awkでも実行できます。

$ awk -F, '{ sum += -$2 } END { print sum }' < /tmp/pwpower.log
244.19
1
zwol

セッドも使えます

$-sed -r 's/[^-]+.(.*)/\1/g' /tmp/pwpower.log
0
Kalanidhi M.

2つの値を合計するには:

(awk -F- '{printf "%s+", $2}' /tmp/pwpower.log; echo 0) | bc -l
0
chaos