Есть ли любой короткий способ сохранить вывод канала в тот же файл, что он обрабатывается. Например, это - то, что я на самом деле делаю
$ cat filename | sort | uniq > result
$ rm -f filename
$ mv result filename
Я задавался вопросом, был ли способ выполнить в нем всего одна строка (не добавляющий те команды с помощью &&)
Это не путь, но понять
$ cat filename | sort | uniq > filename
Можно использовать 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
①
②
Вам не нужна никакая дополнительная команда как 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
опция пишет вывод в тот же файл с на месте методом.
Ваш предложенный пример (ниже) не работает, потому что Вы на самом деле читали бы из и записали бы в тот же файл одновременно.
$ cat filename | sort | uniq > filename
идея с каналом или перенаправлением состоит в том что команда на левой и правой стороне каждого канала или перенаправления, выполненного одновременно, параллельно. Команда на праве обрабатывает информацию, когда это передано ему от команды слева, в то время как команда слева все еще работает.
Для Вашего сценария для работы команда, которая читает из файла, должна была бы закончиться, прежде чем команда, которая пишет в файл, начинается. Для этого для работы необходимо было бы перенаправить вывод во временное местоположение сначала, тогда как только это закончено, отправьте его от временного местоположения назад в файл.
А лучший способ сделать, на который это в основном похоже в Вашем прежнем примере, где Вы перенаправляете во временный файл тогда, переименовывают тот файл назад к оригиналу (за исключением того, что Вы не должны удалять файл сначала, потому что перемещение удаляет любую существующую цель).
$ cat filename | sort | uniq > result
$ mv -f result filename
Вы могли также сохранить его в строковую переменную, за исключением того, что только работает, когда данные являются достаточно маленькими ко всем, умещаются в памяти сразу.
Можно использовать Vim в режиме Ex:
ex -sc 'sort u|x' filename
sort u
вид, уникальный
x
запись, если изменения были внесены (они имеют) и, выходят
Можно использовать эти tee
команда:
sort -u filename | tee filename > /dev/null
tee
команда читает из стандартного входа и записей к стандартному выводу и файлы.