Получить значение JSON из столбца - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть куча двух журналов столбцов, которые разделены вкладками.Второй столбец действителен JSON:

2019-02-28T19:43:48.585Z        {"id": 1234, "catId": 42, "img": "other.jpg"}
2019-02-28T19:44:48.585Z        {"id": 4321, "catId": 999, "img": "my.jpg"}
2019-02-28T19:44:48.585Z        {"id": 1234, "catId": 42, "img": "new.jpg"}
2019-02-28T19:46:48.585Z        {"id": 1234, "catId": 765, "img": "cat.jpg"}

Моя цель - сохранить столбец отметки времени и вывести свойство catId:

2019-02-28T19:43:48.585Z        42
2019-02-28T19:44:48.585Z        999
2019-02-28T19:44:48.585Z        42
2019-02-28T19:46:48.585Z        765

До сих пор я пытался подключитьjq с awk, но я борюсь с командой system.

awk -F '\t' '{printf "\n %s \t %s \n", $1, system("jq .catId <<< " $2)}' file

Любая помощь в правильном направлении будет высоко оценена.

Ответы [ 5 ]

0 голосов
/ 01 марта 2019

Использование Perl

perl -lanE ' $x=$_=~s/(^.*catId":\s*)(\d+).*$/$2/gr; print "$F[0]\t$x" '

с заданными входами

$ cat test.log
2019-02-28T19:43:48.585Z        {"id": 1234, "catId": 42, "img": "other.jpg"}
2019-02-28T19:44:48.585Z        {"id": 4321, "catId": 999, "img": "my.jpg"}
2019-02-28T19:44:48.585Z        {"id": 1234, "catId": 42, "img": "new.jpg"}
2019-02-28T19:46:48.585Z        {"id": 1234, "catId": 765, "img": "cat.jpg"}

$  perl -lanE ' $x=$_=~s/(^.*catId":\s*)(\d+).*$/$2/gr; print "$F[0]\t$x" ' test.log
2019-02-28T19:43:48.585Z        42
2019-02-28T19:44:48.585Z        999
2019-02-28T19:44:48.585Z        42
2019-02-28T19:46:48.585Z        765

$
0 голосов
/ 01 марта 2019
awk '{sub(/,/,"",$5);print $1"\t"$5}' file

2019-02-28T19:43:48.585Z    42
2019-02-28T19:44:48.585Z    999
2019-02-28T19:44:48.585Z    42
2019-02-28T19:46:48.585Z    765
0 голосов
/ 01 марта 2019

Просто добавьте, почему ваш код не работал, так как предыдущие ответы лучше.В вашем случае $2 интерпретировалось как множественные аргументы как jq, так как $2 содержит пробелы.

Так, в приведенном ниже коде $2 помещается в шестнадцатеричные значения одинарные кавычки \x27 изатем двойные кавычки.Также немного форматирования, чтобы сохранить вывод в одной строке.

awk -F '\t' '{printf "%s\t", $1;system("jq .catId <<< \x27"$2"\x27")}' file

Вывод:

2019-02-28T19:43:48.585Z        42
2019-02-28T19:44:48.585Z        999
2019-02-28T19:44:48.585Z        42
2019-02-28T19:46:48.585Z        765
0 голосов
/ 01 марта 2019

в bash:

while IFS=$'\t' read -r timestamp json; do
    printf '%s\t%s\n' "$timestamp" "$(jq -r .catId <<<"$json")"
done < file

это будет намного медленнее, чем jq oneliner.

0 голосов
/ 28 февраля 2019

Если файлы разделены табуляцией, вы можете прочитать файл в необработанном виде, разбить на вкладки, проанализировать и извлечь json, а затем снова присоединиться к вкладкам.

$ jq -Rr 'split("\t") | .[1] |= fromjson.catId | join("\t")' input.log
...