Рейтинг:1

Сортировать файл по полю, начинающемуся со строки

флаг jp

Предположим, у меня есть файл, структурированный так

/home/zz/АВТОРСКИЕ КНИГИ/Автор-Хомский-Кто-Правит-Миром.epub
/home/zz/АВТОРСКИЕ КНИГИ/Автор-Cioran-Il-nulla.epub
/home/zz/КНИГИ/Автор-Artemis-Mathematica-Examples.nb
/home/zz/Книги/Автор-Zigniwe-Hisory-Medicine.pdf
/home/z1/OLDBOOKS1/OLDBOOKS2/Автор-Ватанабэ-Ватерлоо.pdf
/home/z2/OLDBOOKS1/OLDBOOKS2/Автор-Барберо-Лепанто.epub.pdf

Я хотел бы, чтобы файл отсортировался следующим образом:

/home/zz/КНИГИ/Автор-Artemis-Mathematica-Examples.nb
/home/z2/OLDBOOKS1/OLDBOOKS2/Автор-Барберо-Лепанто.epub.pdf
/home/zz/АВТОРСКИЕ КНИГИ/Автор-Хомский-Кто-Правит-Миром.epub
/home/zz/АВТОРСКИЕ КНИГИ/Автор-Cioran-Il-nulla.epub
/home/z1/OLDBOOKS1/OLDBOOKS2/Автор-Ватанабэ-Ватерлоо.pdf
/home/zz/Книги/Автор-Zigniwe-History-Medicine.pdf

То есть по алфавиту, по строке Автор-...

Как видите, положение Автор-... не является постоянным.

Как я могу это сделать?

FedKad avatar
флаг cn
Этот вопрос был бы более интересным, если бы не существовало разделителя (например, `-`) для запуска «ключа 2». Например, как мы можем сортировать, используя имя файла _whole_?
waltinator avatar
флаг it
Прочтите `man sort` и книгу Кнута "Сортировка и поиск", том 4 "Основных алгоритмов".
флаг ar
Если вы считаете, что один из ответов правильный, примите его, нажав на серую галочку ‚ï¸ рядом с этим ответом, и сделайте ее зеленой ″. Это поможет другим.
Рейтинг:3
флаг hr

Хотя это излишне для настоящего примера из-за решение, предложенное в ответе пользователя68186, вы могли бы сделать что-то вроде этого в GNU awk:

глазеть -F/ '
  функция mycmp(i1,v1,i2,v2) {
    м = разделить (v1, а);
    n = разделить (v2, b);
    вернуть a[m]"" > b[n]"" ? 1 : а[м]"" < б[н]"" ? -1 : 0
  }
  {
    строки[NR] = $0
  }
  КОНЕЦ {
    PROCINFO["sorted_in"] = "mycmp";
    for(i in lines) печатать строки[i]
  }
' файл

Обратите внимание, что он сортируется в соответствии с лексическим значением всего после последнего / - так что если формат Автор-<имя автора>-<название>.<расширение> это будет

  • фиксированная строка Автор- (что не имеет никакого эффекта, так как имеет одинаковый вес для всех линий); тогда
  • <имя автора>-; тогда
  • <название>.; тогда
  • <extension>

Это похоже на то, как GNU Сортироватьпростой KEYDEF -т- -к2 работает, то есть эффективный ключ сортировки начинается с <author name> и продолжается до конца строки.

Явный разделитель опущен в расколоть вызовы, чтобы они наследовали значение ФС, что упрощает изменение для систем, использующих другой разделитель пути. Добавленные пустые строки "" в mycmp функция вызывает лексическое сравнение, даже если имена файлов числовые - см., например Как awk выполняет преобразование между строками и числами


Если вы предпочитаете придерживаться Сортировать команду, вы можете использовать GNU awk Двусторонняя связь с другим процессом к:

  • продублировать последний /-разделенное поле в начале строки
  • передать результат в Сортировать команда
  • прочитать отсортированный результат, удалить повторяющийся префикс и распечатать

то есть

глазеть -F/ '
  НАЧАЛО {ОФС=ФС; cmd = "сортировать -d"} 
  {print $NF $0 |& cmd} 
  КОНЕЦ {
    близко (команда, "к"); 
    в то время как (cmd |& getline) {$ 1 = ""; Распечатать};
    закрыть(cmd,"от")
  }
' файл

Здесь есть небольшой обман в том, что абсолютные пути (строки начинаются с /) подразумевают начальное пустое поле; для обработки относительных путей, которые вам нужно изменить напечатать $NF $0 к напечатать $NF,$0 вставить «отсутствующий» разделитель, а затем, возможно, использовать регулярное выражение суб() вместо более простого $1 = "" для удаления ведущего элемента.

А также потенциально быстрее/более эффективно использовать память, чем чистый пялиться решение, это позволяет другим Сортировать опции, которые будут добавлены прямо напр. cmd = "сортировать -d -t "FS" -k1,1r" .

флаг ar
Замечательно! Я не совсем понимаю, что происходит в функции "mycmp". Не могли бы вы указать мне веб-учебник? Спасибо!
флаг hr
Пользовательские функции сортировки @user68186 обсуждаются в Руководстве пользователя GNU Awk по адресу [Controlling Array Traversal](https://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Array-Traversal). комментарий в ответ!
флаг ar
Спасибо за ссылку, я понимаю ее немного лучше, но в `gawk` можно многому научиться. И, как вы хотели, я превратил свой комментарий в ответ. :)
флаг ar
+1 за добавленное объяснение! Теперь немного о `return a[m]"" > b[n]"" ? 1 час ночи]""
флаг hr
@ user68186 это всего лишь два [троичных условия] (https://www.gnu.org/software/gawk/manual/gawk.html#Conditional-Exp) в плаще
Рейтинг:3
флаг ar

Попробуйте следующее бить команда:

sort -t- -d -k2 -o output.txt input.txt

Он имеет четыре параметра плюс имя входного файла. ввод.txt. Если этот файл не находится в текущем каталоге, вам нужно будет предоставить путь/к/папке/input.txt. Варианты и их аргументы следующие:

  • -t отмечает разделитель полей. Мы используем - как разделитель, чтобы все до и после - считаются отдельными столбцами.
  • -d указывает сортировку по словарю. Например, Apple предшествует Berry.
  • -k2 указывает столбец для сортировки, в данном случае второй столбец. Обратите внимание, что первый столбец — это все, что предшествует первому. -. Например, /home/zz/КНИГИ/Автор. Второй столбец находится между первым и вторым -, это, Артемида.
  • вывод.txt перенаправляет отсортированный вывод в файл, а не на терминал.

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

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.