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

Есть ли любой короткий способ сохранить вывод канала в тот же файл, что он обрабатывается. Например, это - то, что я на самом деле делаю

$ cat filename | sort | uniq > result
$ rm -f filename
$ mv result filename

Я задавался вопросом, был ли способ выполнить в нем всего одна строка (не добавляющий те команды с помощью &&)

Это не путь, но понять

$ cat filename | sort | uniq > filename
14
задан 24 April 2018 в 02:06

5 ответов

Можно использовать sponge от moreutils пакета:

LC_ALL=C sort -u filename | sponge filename

Вы также не должны передавать по каналу к uniq, с тех пор, когда sort имеет -u опция к уникальным строкам при сортировке.

Обратите внимание на это в системе GNU с локалями UTF-8, sort -u или sort | uniq не дал Вам уникальные строки, но первое от последовательности строк, которые сортируют то же в текущей локали.

$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=en_US.utf8 sort | LC_ALL=en_US.utf8 uniq
①

дал Вам только . Изменение локали к C вызывает порядок сортировки на основе значений байта:

$ export LC_ALL=C
$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=C sort | LC_ALL=C uniq
①
②
18
ответ дан 23 November 2019 в 02:54

Вам не нужна никакая дополнительная команда как cat и uniq и также не используя rm команда и mv команда к удалению и переименованию имени файла. просто используйте простую команду.

sort -u filename -o filename


 -u, --unique
        with -c, check for strict ordering; without -c, output only  the
        first of an equal run

 -o, --output=FILE
        write result to FILE instead of standard output

, Как это работает?

sort команда сортирует Ваше имя файла и с -u опция, удаляет дублирующиеся строки из него. тогда с -o опция пишет вывод в тот же файл с на месте методом.

12
ответ дан 23 November 2019 в 02:54

Ваш предложенный пример (ниже) не работает, потому что Вы на самом деле читали бы из и записали бы в тот же файл одновременно.

$ cat filename | sort | uniq > filename

идея с каналом или перенаправлением состоит в том что команда на левой и правой стороне каждого канала или перенаправления, выполненного одновременно, параллельно. Команда на праве обрабатывает информацию, когда это передано ему от команды слева, в то время как команда слева все еще работает.

Для Вашего сценария для работы команда, которая читает из файла, должна была бы закончиться, прежде чем команда, которая пишет в файл, начинается. Для этого для работы необходимо было бы перенаправить вывод во временное местоположение сначала, тогда как только это закончено, отправьте его от временного местоположения назад в файл.

А лучший способ сделать, на который это в основном похоже в Вашем прежнем примере, где Вы перенаправляете во временный файл тогда, переименовывают тот файл назад к оригиналу (за исключением того, что Вы не должны удалять файл сначала, потому что перемещение удаляет любую существующую цель).

$ cat filename | sort | uniq > result
$ mv -f result filename

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

3
ответ дан 23 November 2019 в 02:54

Можно использовать Vim в режиме Ex:

ex -sc 'sort u|x' filename
  1. sort u вид, уникальный

  2. x запись, если изменения были внесены (они имеют) и, выходят

0
ответ дан 23 November 2019 в 02:54

Можно использовать эти tee команда:

sort -u filename | tee filename > /dev/null

tee команда читает из стандартного входа и записей к стандартному выводу и файлы.

2
ответ дан 23 November 2019 в 02:54

Другие вопросы по тегам:

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