AWKで行(行)を減算する方法


9

AWKを使用してラインを減算する方法を理解しようとしています。たとえば、入力ファイルが次のとおりだとします。

30
20

出力は次のようになります。

10

テストとして、「使用済み」メモリ列を次のように計算しようとしています。

$ cat /proc/meminfo

だから今私はこれを書きました:

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    -- Here comes the calculation using AWK

私は以下を試しました:

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | awk '{$0-s}{s=$0} END {print s}' 

しかし、これは私にデータの最後の行を与えるだけです。

有効な解決策を見つけましたが、それが最適な解決策ではないかと思います。私のすべてのコーディング経験から、行数をハードコーディングするのはひどいことがわかります:P

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | awk 'NR == 1{s=$0} NR == 2 {s=s-$0} END {print s}'

N行で何をしたいですか?最終結果は line1_$2 - line2_$2 - lineN-$2どうでしょうか?最初の2つの連続する行だけを減算しますか?
terdon

回答:


9

また、使用してこれを行うことができawkpastebc。私はこのアプローチを覚えやすいと思います。の構文でawkは、確認のために常に調べなければなりません。

注:このアプローチには、複数行の出力を処理できるという利点があり、2番目、3番目、4番目などの数を1番目から減算します。

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | paste -sd- - | bc
7513404

細部

上記はawkを使用して、減算する数値を含む列を選択します。

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'
7969084
408432

次に、を使用pasteしてこれらの2つの値の値を結合し、それらの間にマイナス記号を追加します。

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'| paste -sd- -
7969084-346660

これを渡すbcと、計算が実行されます。

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'| paste -sd- - | bc
7513404

@terdon-ありがとうございます。編集を行ったときに編集を行っていました8
slm

3

純粋なawkソリューション、冗長なcatまたはgrepコマンドなし:

awk '/MemTotal/ {TOT=$2} /MemFree/ {FREE=$2} END {printf("%d kB Used\n", TOT-FREE)}' /proc/meminfo

私はawk_FTWが私を打ち負かすのを見ますが、出力をフォーマットすることは素晴らしいかもしれませんが。


3

これを試して:

grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk 'NR==1{s=$2;next}{s-=$2}END{print s}'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.