Найдите шаблон и создайте файл с таким же именем

Не могли бы вы установить ручной режим и выполнить sudo iw dev <interface> scan? Найдите свою точку доступа в списке и зафиксируйте строку «Страна». Если он установлен, например. ROW (Остальной мир )или США, телефон Android выбирает канал 12, несмотря на отправку сообщения о том, что он находится в регионе, где этот канал запрещен. Это может привести к тому, что адаптер будет игнорировать эту точку доступа, если она использует канал, запрещенный в рекламируемой стране. Тогда может помочь обновление прошивки.

0
25.10.2021, 14:24
2 ответа

Ваш файл состоит из набора объектов JSON. Каждый объект содержит ключ .location_country. Из каждого объекта мы можем создать команду оболочки, которая записывает сериализованную копию самого объекта в файл, имя которого соответствует значению ключа .location_country. Эти команды оболочки затем могут быть выполнены оболочкой.

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

jq -r '"printf \"%s\\n\" \(. | @json | @sh) >\(.location_country|@sh).txt"' file.txt

Сериализованный объект может быть создан с помощью оператора @jsonв jq, который выдает закодированную строку JSON, содержащую входной документ, в данном случае текущий объект. Затем это передается в @sh, чтобы правильно указать строку для оболочки. Оператор @shтакже используется для создания части имени выходного файла из значения ключа .location_country.

Команда фактически создает шелл-код, который вызывает printf, выводя текущий объект и перенаправляя вывод в определенный файл.

Принимая во внимание данные вашего примера в file.txt, это выдаст следующее:

printf "%s\n" '{"full_name":"name1","location_country":"united kingdom"}' >'united kingdom'.txt
printf "%s\n" '{"full_name":"name2","location_country":"united states"}' >'united states'.txt
printf "%s\n" '{"full_name":"name3","location_country":"china"}' >'china'.txt

Вы можете перенаправить это в отдельный файл и запустить его с помощью shдля выполнения команд, или вы можете использовать evalнепосредственно в оболочке:

eval "$( jq...as above... )"

Поскольку мы используем правильный синтаксический анализатор JSON, jq, описанное выше будет работать, даже если входной документ JSON не отформатирован с одним объектом в строке.

$ cat file.txt
{
  "full_name": "name1",
  "location_country": "united kingdom"
}
{
  "full_name": "name2",
  "location_country": "united states"
}
{
  "full_name": "name3",
  "location_country": "china"
}
$ jq -r '"printf \"%s\\n\" \(. | @json | @sh) >\(.location_country|@sh).txt"' file.txt
printf "%s\n" '{"full_name":"name1","location_country":"united kingdom"}' >'united kingdom'.txt
printf "%s\n" '{"full_name":"name2","location_country":"united states"}' >'united states'.txt
printf "%s\n" '{"full_name":"name3","location_country":"china"}' >'china'.txt
$ eval "$( jq -r '"printf \"%s\\n\" \(. | @json | @sh) >\(.location_country|@sh).txt"' file.txt )"
$ ls
china.txt           file.txt            united kingdom.txt  united states.txt
$ cat 'united kingdom.txt'
{"full_name":"name1","location_country":"united kingdom"}
0
25.10.2021, 16:09

Учитывая ваши комментарии ниже, это должно делать то, что вы хотите, используя GNU awk для соответствия 3-го аргумента ()и обработки многих одновременно открытых файлов:

awk 'match($0,/"location_country":"([^"]+)"/,a) { print > (a[1] ".txt") }' file

Для скорости выполнения подход с декорированием/сортировкой/использованием/недекорированием, вероятно, был бы лучшим, например.:

awk -v OFS='"' 'match($0,/"location_country":"[^"]+"/) { print substr($0,RSTART+20,RLENGTH-21), $0 }' file |
sort -t'"' -k1,1 |
awk -F'"' '$1!=prev { close(out); out=$1 ".txt"; prev=$1 } { print > out }' |
cut -d'"' -f2-

и это будет работать с любой сортировкой, awk и cut.


Оригинальный ответ:

Если ваши данные всегда такие простые/регулярные, то все, что вам нужно, это GNU awk (для обработки множества одновременно открытых выходных файлов):

awk -F'"' '{ print > ($5 ".txt") }' file

или это с любым awk:

awk -F'"' '{
    out = $5 ".txt"
    if ( !seen[out]++ ) {
        printf "" > out
    }
    print >> out
    close(out)
}' file

Описанное выше будет работать независимо от размера вашего входного файла, если у вас есть свободное место на диске для создания выходных файлов.

Вы можете сделать это более эффективно, сначала отсортировав по названию страны, если хотите.:

sort -t'"' -k5,5 file |
awk -F'"' '$5 != prev{ close(out); out=$5 ".txt"; prev=$5 } { print > out }'

Этот последний сценарий будет работать с любой сортировкой и любым awk, но он может изменить порядок строк ввода для каждой страны. Если вы заботитесь об этом и у вас есть сортировка GNU, добавьте аргумент -s. Если вам не все равно и у вас нет сортировки GNU, дайте мне знать, так как есть довольно простой обходной путь.

0
26.10.2021, 01:18

Теги

Похожие вопросы