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