Используйте "объединение",-j
$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp[]|" ",.name),"\n"' test_json
name: cust1
groups: BA2 GA1 NA1 TR3 TS1
И с заполнителем
$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp//[{"name":"-"}]|.[]|" ",.name),"\n"' test_json
name: cust1
groups: -
Сортировка файлов по отдельности и перенаправление всего вывода в результирующий файл:
for file in *.txt ; do
sort -k1,1rn < "$file"
done > file.concatenated
(здесь важно, чтобы выходной файл не имел расширения .txt
, так как он сначала создается с помощью перенаправления ).
Или, если вы хотите отсортировать файлы на месте (, перезаписав их отсортированными поверх самих себя):
set -- *.txt
ok=true
for file do
sort -o "$file" -k1,1rn -- "$file" || ok=false
done
"$ok" && cat -- "$@" > file.concatenated
Этот двухэтапный подход позволяет нам обнаруживать проблемы с сортировкой файлов перед созданием составного файла.
Ваш первый цикл не работал, так как вы передавали полный список .txt
файлов при каждом проходе цикла.
sort -m
заключается в объединении уже отсортированных файлов в отсортированный вывод.Это противоположно тому, что вы хотите. Вы хотите отсортировать файлы, которые еще не отсортированы, и просто объединить результаты, не объединяя их в отсортированный вывод.
Здесь файлы кажутся отсортированными в прямом порядке. Если вы можете полагаться на то, что это всегда так, вы сможете просто перевернуть их, что будет намного эффективнее, чем сортировка в обратном порядке.
Для этого в системах GNU есть команда tac
и несколько других tail -r
(, однако имейте в виду, что некоторые реализации принимают только один файловый аргумент, поэтому вам, возможно, придется прибегнуть к циклу с этими ).
tac -- *.txt > file.concatenated
Также обратите внимание, что -k1,1rn
не то же самое, что -rnk1,1
, когда дело доходит до разрешения ничьих. Когда две строки сравниваются одинаково, sort
прибегает к лексическому сравнению всей строки (, например здесь 1 a
и 1 b
сравниваются одинаково с -k1,1n
, но 1 a
лексически предшествует 1 b
).
С опцией -r
последнее сравнение выполняется в обратном порядке. Это не применяется, когда к одной из ключевых спецификаций добавляется флаг r
.
GNU sort
должен -s
отключить это последнее сравнение, которое заставит его сохранить исходный порядок строк, которые сравниваются одинаково.