У меня есть несколько папок, которые содержат множество текстовых файлов, от десятков до сотен. Эти текстовые файлы представляют собой простые базы данных, содержащие миллионы строк, причем каждая строка содержит одну запись. Однако записи в них не отсортированы и содержат много дубликатов. Я бы хотел отсортировать и дублировать их все по отдельности (т.е. независимо друг от друга), но, насколько я понимаю, sort может производить только объединенный вывод всех входных файлов, то есть, даже если дано несколько файлов, она будет создать только один выходной файл, содержащий объединенные результаты всех этих файлов.

Как я могу отсортировать все файлы в текущей папке, чтобы получить индивидуально отсортированный выходной файл для каждого? Я также хотел бы, чтобы выходные файлы выводились во вложенную папку в текущем каталоге. Цикл for - очевидное решение для меня, но я спрашиваю здесь на случай, если есть какой-то более простой способ сделать это с sort , с которой я не сталкивался и не пропустил. Моим знаниям по bash также очень не хватает, поэтому, если цикл for является самым простым решением, я был бы признателен за то, что кто-то предоставил бы лучший способ добиться этого, вместо того, чтобы тратить много дней на то, чтобы взломать что-то вместе, что все равно не соответствует тому, что я хочу делать.

1 ответ1

1

Да, вы можете сделать это с for Даже если есть «какой-то более простой способ сделать это с помощью sort » (но я так не думаю), это также довольно просто:

# cd to the directory you want to process

mkdir sorted    
for file in *; 
do
   printf 'Processing %s\n' "$file"
   [ -f "$file" ] && sort -u "$file" > "./sorted/$file"
done

Заметки:

  • for file in * не обрабатывает файлы в подкаталогах.
  • printf только для отчета о прогрессе. Фактически это должно быть помещено после [ ... ] (см. Ниже), но я не хочу слишком усложнять код. Вы можете просто удалить строку printf , если хотите, чтобы все было тихо.
  • [ -f "$file" ] проверяет, является ли $file обычным файлом. С наиболее общим шаблоном (т. Е. *) Нам нужно это условие по крайней мере, чтобы избежать запуска sort с sorted каталогом в качестве аргумента (это приведет к ошибке, безвредной, но не элегантной). Скорее всего, этот тест не понадобится, если вы используете вместо *.txt более конкретный глобус, например *.db или * (например, для пропуска случайного файла desktop.ini который не должен обрабатываться). В этом случае вы можете опустить [ ... ] && и начать строку с sort (хотя оставить строку нетронутой не должно быть больно).
  • sort поддерживает различные параметры, и вы можете использовать некоторые из них, в зависимости от того, как вам нужно сортировать.

  • sort -u дедуплицирует записи сразу после их сортировки, а если sort уже используется, это менее излишняя альтернатива использованию команды uniq .

Если вам нужно выбрать файлы в соответствии с более сложными условиями, чем простой глобус, лучше начать с find . Для текущей задачи for должна быть тонкой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .