行の残りのGrep…試合後


8

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

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

回答:


12

すべての値:

$ 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

1
FSはそれほど複雑である必要はありません-F-
グレンジャックマン2014年

より複雑な入力の場合、先行するフィールドにスペースがあるかどうかがわからない場合は、フィールドの区切り文字としてカンマを使用して、tr -d "- "最初にすべてを実行できます。
Jason C

@glennjackman私が質問を解釈する方法は、値が負でない可能性がある(生成なし)場合があること-F-です。
エイドリアンFrühwirth2014年

実際、私はそれをよく読んでいませんでした。
グレン・ジャックマン2014年

8

を使用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

6

KISSアプローチ

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

1
接吻?それは何ですか?
Bernhard

シンプルで愚かさを保つ;)
スチールドライバー

はい@sim私ミスリードしない限り、OP、具体的に、除去すべき兆候を求めた
steeldriver

@steeldriver-ああはい、私の悪い、そこに埋められたその文を逃しました。
slm

4
シンプルに、愚かにしてください。あなたがそれを単純にしていないことを暗示するために、あなたは愚かです。
Matt

4

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

catを使用しない方が若干効率的ですが、ファイル名を引数として最初のコマンドに渡し、ファイルを読み取らせます。また、ファイルの最初または最後の行だけを処理している場合は、最初にheador tailコマンドを使用する方が理にかなっているため、1行だけをと一致させる必要がありますgrep

最初の値:

$ 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

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

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

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


1

awkは適切なツールですが、数値はおそらく正(右?)になる可能あります。つまり、マイナス記号をフィールド区切り文字として使用したくないということです。代わりに、フィールドの区切り文字としてカンマを使用し、次に各値を数値で否定します- 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

awk sqrt($2^2)では、絶対値を取得するためのトリックとして使用できます。
Jason C

@JasonCそれは賢いことですが、コンテキストでは、それを行うのは間違っていると思います。
zwol 2014年

0

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

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

これは少し冗長です。なぜ地球上ではnogの計算オプションを使用するのawkですか?
Bernhard

1
ええ、本当ですが、私はbc=)が好きです
chaos

1
ああ、それでは、なぜ使用するのawkですか?echo $(cut -d- -f2 file | tr '\n' '+')0 | bc
Bernhard

@Bernhardさて、なぜ使用するのcutですか?[insert_cmd_here]代わりに使用して、サブシェルループを生成し、新しい数学を発明し、人間のクラスターまたは暗算を使用し、私の考えをパイプしbcます。なぜ私たちは物事をするのですか?私の答えを悪くする理由はありません。
2014年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.