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