В скрипте bash, как удалить все двойные кавычки в наборе данных JSON {}, между двойными кавычками - PullRequest
1 голос
/ 07 октября 2019

У меня есть массивный 20-гигабайтный файл JSON с записями недвижимости.

пример фрагмента

{"id":2545,"name":"No cribs (infant beds) available"},{"description": "Here is some text with a <a href=\"stupidurl.com\">click here</a>"}

Я пытаюсь использовать цикл WHILE в bash для чтения файла построчно и извлечениятолько данные, которые я хочу, в новый, меньший файл для последующей обработки.

while read line; do
        #All this If Statement does is look for a pattern to identify the line I want to save 
        if [[ ($line == *"\"country_code\":\"US\","* ]]; then

            echo $line  >> $JSON_FILE_FILTERED
        fi

    done < $JSON_FILE

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

href=\"mylink\"

становится ...

href="mylink"

... в новом файле JSON, что вызывает ошибки синтаксического анализа JQ.

Мне нужно либо удалить двойные кавычки в скобках JSON, либо изобразить оператор echo, чтобы сохранить экранированные кавычки при их записи в новый текстовый файл.

Я пробовал различные итерацииsed, tr и др. echo -e и printf. В основном мне не повезло.

Прямо сейчас я могу удалить все теги между ними с помощью ...

echo $line | sed -e 's/<[^>]*>//g' >> $JSON_FILE_FILTERED

..., что несколько работает, но не исправляет другие двойные кавычки в скобках данных

{"description": "Here is some text with \"Some Big Guy's\" hat"}
{"description": "Here is some text with "Some Big Guy's" hat"}

1 Ответ

0 голосов
/ 08 октября 2019

Это не команда echo, а команда read, которая удаляет обратную косую черту.
Пожалуйста, попробуйте вместо этого:

while IFS= read -r line; do
    if [[ $line == *"\\\"country_code\\\":\\\"US\\\","* ]]; then
        echo "$line" >> "$JSON_FILE_FILTERED"
    fi
done < "$JSON_FILE"
  • Вам необходимо добавить опцию -r вread, чтобы сохранить обратную косую черту как часть строки.
  • У вас есть лишний левый знак ( между [[и]]. (Опечатка?)
  • Вам необходимо избежать обратной косой черты между [[и]].
  • Вам необходимо заключить переменные в двойные кавычки.

Однаковсе еще неэффективно читать файл размером 20 ГБ с помощью сценария bash.
Будет лучше сказать:

grep -F '"\"country_code\":\"US\","' file.json > filtered.json

Надеюсь, это поможет.

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