1

DeviceId次のような形式のログ ファイルから一意の を取得しようとすると、いくつかの問題が発生します。

log: {"deviceInfo":{"DeviceId":"123","device":"Android"}
log: {"deviceInfo":{"device":"Android","DeviceId":"123"}
log: {"deviceInfo":{"device":"Android","DeviceId":"234"}
log: {"deviceInfo":{"device":"iPhone","DeviceId":"323"}
log: {"deviceInfo":{"device":"iPhone","DeviceId":"323"}

私が期待しているのは、次のような出力です。

log: {"deviceInfo":{"DeviceId":"123","device":"Android"}
log: {"deviceInfo":{"device":"Android","DeviceId":"234"}
log: {"deviceInfo":{"device":"iPhone","DeviceId":"323"}

使ってみawkましたが、なんとなくわかります。誰もこれを行う方法を知っていますか?

DeviceIdを使用して印刷する方法があるはずですが、awkそれを理解できないようです。を取得したら、andDeviceIdにパイプするだけです。sortuniq

4

6 に答える 6

4

Perlを使用する:

perl -lne 'if ( m{"DeviceId":" ([^"]+) "}xms ) { print if not $seen{$1}++; }' <log
于 2013-02-25T18:02:24.993 に答える
4

GNU awk の場合:

gawk 'match($0, /DeviceId":"([^"]+)/, a) && seen[a[1]]++ == 0' log

あなたの入力を考えると、これは出力します

log: {"deviceInfo":{"DeviceId":"123","device":"Android"}
log: {"deviceInfo":{"device":"Android","DeviceId":"234"}
log: {"deviceInfo":{"device":"iPhone","DeviceId":"323"}

注、これは本質的に@Perleoneの回答のgawk翻訳ですが、当時は気づきませんでした

于 2013-02-25T18:57:53.333 に答える
1

を使用した一意のデバイス ID awk:

$ awk '/DeviceId/&&!a[$1]++&&gsub(/[^[:digit:]]/,"")' RS='[{,}]' file
123
234
323

の良いawkところは、連想配列です。パイプする必要はありませんsort -u

于 2013-02-25T18:28:22.277 に答える
1

任意の awk で:

$ awk '{id=$0;gsub(/.*DeviceId":"|".*/,"",id)} !seen[id]++' file
log: {"deviceInfo":{"DeviceId":"123","device":"Android"}
log: {"deviceInfo":{"device":"Android","DeviceId":"234"}
log: {"deviceInfo":{"device":"iPhone","DeviceId":"323"}
于 2013-02-25T23:41:39.950 に答える
1

@cnicutar の回答に基づいてsed、 、sortおよび を使用しcutます。

sed 's/.*\"DeviceId":"\([0-9]*\).*/\1\t\0/' <file> | sort -u -k 1,1 | cut -f 2

出力:

log: {"deviceInfo":{"DeviceId":"123","device":"Android"}
log: {"deviceInfo":{"device":"Android","DeviceId":"234"}
log: {"deviceInfo":{"device":"iPhone","DeviceId":"323"}
于 2013-02-25T17:56:19.637 に答える
1

JSONを解析する方が良いです(ただし、別の簡単なawk):

awk -F'.*DeviceId":"|["}]' '!A[$2]++' file 

Ed Morton の提案を適用して、さらに 3 文字削除します。

awk -F'.*DeviceId":"|"' '!A[$2]++' file 
于 2013-02-25T23:50:57.580 に答える