CURLからデータをインポート、マージ、エクスポート

CURLからデータをインポート、マージ、エクスポート

まず、英語は私の言語ではありません。理解しやすくします:-) 第二に、私は通常のLinuxユーザーではなく、今始めました。

私はcurlWebチャットプラットフォームのAPIを使用してチームのステータスを確認しています。各メンバーには1つの結果がありますID。各メンバーについて、ID結果をテキストファイルに送信しますagent-#.txtagent-1.txtしたがって、自分のフォルダに5人のメンバーがいる場合、5つのファイルが作成されますagent-2.txt

各ファイルには次の内容が含まれています。

{
    "used": 0,
    "last": "2018-06-01 15:25:55",
    "presence": [],
    "away": false,
    "free": 3,
    "last_utc": "2018-06-01 13:25:55",
    "last_timezone": "Europe/Paris",
    "online": true,
    "offline": true
}

次に、sedIを使用して不要なデータを削除します。

sed -i -e '/{/d; /last/d; /presence/d; /last_utc/d; /last_timezone/d; /offline/d; /}/d; s/"//g; s/,//g; s/[ ]//g; /^\s*$/d' *

各ファイルについて以下を取得します。

used:#
away:false
free:#
online:true

ここでは#、数値(エージェントで使用されているスロットの総数と利用可能なスロットの数)です。

いいですね。しかし、今このデータをマージして次のようにしたいと思います。

  1. 評価のあるメンバーの総数online:true
  2. 無料および使用済みスロットの総数

理想的には、他のファイルに合計を出力するコマンドを探しています。しかし、プロセス全体を処理できるアイデア(コマンド、スクリプト全体)があれば興味があります!

答え1

変更されていないJSONファイルを使用して(実行前sedjq:

オンラインユーザー:

jq -s 'map(select(.online))|length' agent-*.txt

無料スロット数:

jq -s '[.[].free]|add' agent-*.txt

使用されたスロット数:

jq -s '[.[].used]|add' agent-*.txt

3 つすべてが 1 つの JSON 文書として表示されます。

jq -s '{online: map(select(.online))|length, free: [.[].free]|add, used: [.[].used]|add}' agent-*.txt

上記と同じですが、数字しかありません。

jq -s '(map(select(.online))|length), ([.[].free]|add), ([.[].used]|add)' agent-*.txt

答え2

agent-*.txtawkを介してファイルをリンクして処理できます。

-F :フィールド区切り文字として列全体を使用することに注意してください。

不完全な例:

#!/bin/sh

awk -F : -f - agent-*.txt <<EOF
/^used:/{
    used+=\$2;
}
/^online:true/{
    online++;
}
END{
    printf("used: %d\n", used);
    printf("online: %d\n", online);
}
EOF

おそらく、一致する式を慎重に変更すると、このsed手順をスキップできます。

関連情報