извлекать строки из файла, которые не соответствуют определенным критериям - PullRequest
1 голос
/ 18 марта 2020

в следующем файле, мне нужно получить все строки, в которых нет следующего шаблона:

\"\d\d\d\":[

мне не нужна строка "memo": { или "notice": "delivered on 17", я просто хочу строки, которые имеют \"\d\d\d\":[, но вместо этого имеют \"\d\d\":[ или \"\s\d\d\":[ et c. Как это можно сделать с помощью sed или awk или, что еще лучше, с jq?

Мне просто нужны строки, в которых нет шаблона \"\d\d\d\":[, например, \"42 \":[. Каждая строка сообщения должна иметь \"\d\d\d\":[, а не любые другие варианты. Например, \"42a\":[ также неверно, и о нем следует сообщить

{
  "memo": {
    "notice": "delivered on 17"
  },
  "message": "{\"id\":\"1\",\"401\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "memo": {
    "notice": "delivered on 190"
  },
  "message": "{\"id\":\"2\",\"424\":[[\" 0\",[\"v\",\"UK\"],[\"9\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "memo": {
    "notice": "delivered on 734"
  },
  "message": "{\"id\":\"3\",\"432\":[[\" 0\",[\"a\",\"UK\"],[\"9\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"v\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "memo": {
    "notice": "delivered on 1092"
  },
  "message": "{\"id\":\"888\",\"5 2\":[[\" 0\",[\"v\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}

в качестве выходных данных. Мне нужно значение id для строк, в которых возникают эти проблемы.

ожидаемый результат из вышеприведенного : id: 888, так как в этой строке есть ошибочный \"5 2\":[

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Декодировать все message s, выбрать те, которые не содержат ни одного ключа, совпадающего с \d{3}, и извлечь их id s.

jq '.message | fromjson | select(any(keys_unsorted[]; test("[0-9]{3}")) | not) .id' file
0 голосов
/ 18 марта 2020

в следующем файле, мне нужно получить все строки, в которых нет следующего шаблона:

\"\d\d\d\":[

Как насчет

awk '$0 ~ /\\"\\d\\d\\d\\":\[/ {next;}{print;}' test.txt | awk '$0 ~ /memo/ {next;}{print;}' | awk '$0 ~ /notice/ {next;}{print;}'

{}, "message": "{\" id \ ": \" 1 \ ", \" 401 \ ": [[\" 0 \ ", [\" a \ " , \ "UK \"], [\ "b \", \ "Euy / O \"], [\ "c \", \ "20160811 \"], [\ "g \", \ "R2 \" ]], [\ "1 \", [\ "a \", \ "UK \"], [\ "b \", \ "LO \"], [\ "c \", \ "20160811 \" ]]]} "} {}," message ":" {\ "id \": \ "2 \", \ "424 \": [[\ \ 0 \ ", [\" v \ ", \" Великобритания \ "], [\" 9 \ ", \" Euy / O \ "], [\" c \ ", \" 20160811 \ "], [\" g \ ", \" R2 \ "]], [\ "1 \", [\ "a \", \ "UK \"], [\ "b \", \ "LO \"], [\ "c \", \ "20160811 \"]]] } "} {}," message ":" {\ "id \": \ "3 \", \ "432 \": [[\ "0 \", [\ "a \", \ "UK \" ], [\ "9 \", \ "Euy / O \"], [\ "c \", \ "20160811 \"], [\ "v \", \ "R2 \"]], [\ " 1 \ ", [\" a \ ", \" UK \ "], [\" b \ ", \" LO \ "], [\" c \ ", \" 20160811 \ "]]]}"} {}, "message": "{\" id \ ": \" 888 \ ", \" 532 \ ": [[\" 0 \ ", [\" v \ ", \" UK \ "], [ \ "b \", \ "Euy / O \"], [\ "c \", \ "20160811 \"], [\ "g \", \ "R2 \"]], [\ "1 \" , [\ "a \", \ "UK \"], [\ "b \", \ "LO \"], [\ "c \", \ "20160811 \"]]]} "}

возможно, вам все еще нужно почистить скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...