сортировать несколько файлов и объединять

Используйте "объединение",-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: -
1
25.08.2020, 13:51
1 ответ

Сортировка файлов по отдельности и перенаправление всего вывода в результирующий файл:

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отключить это последнее сравнение, которое заставит его сохранить исходный порядок строк, которые сравниваются одинаково.

4
18.03.2021, 23:10

Теги

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