Есть ли какой-нибудь короткий способ сохранить вывод канала в тот же файл, который он обрабатывает. Например, это то, что я на самом деле делаю
$ cat filename | sort | uniq > result
$ rm -f filename
$ mv result filename
Мне было интересно, если есть способ сделать это в одну строку (не добавляя эти команды с помощью &&)
Это не способ, но чтобы получить представление
$ cat filename | sort | uniq > filename
command-line
bash
whitenoisedb
источник
источник
echo $(cat filename | sort | uniq > result) > filename
или что-то ? Просто проходя мимо, у меня нет времени, чтобы попробовать это.Ответы:
Вы можете использовать
sponge
из пакета moreutils :Вы также не нуждаетесь в конвейере
uniq
, так как, когдаsort
есть-u
опция для уникальных строк при сортировке.Обратите внимание , что в системе GNU с UTF-8 районов,
sort -u
илиsort | uniq
не дают вам уникальные линии, но первый из последовательности линий, своего рода то же самое в текущей локали.дал только тебе
①
. Изменение языкового стандарта на C заставляет порядок сортировки на основе значений байтов:источник
Вам не нужны никакие дополнительные команды, такие как,
cat
аuniq
также без использованияrm
команды иmv
команды для удаления и переименования имени файла. просто используйте простую команду.Как это работает?
sort
Команда сортирует ваше имя файла и с-u
опцией удаляет из него дублирующиеся строки. затем с-o
параметром записывает вывод в тот же файл с методом на месте.источник
sort
работы, вы потеряете ваш оригинальный файл.Предлагаемый вами пример (ниже) не работает, потому что вы на самом деле читаете и пишете в один и тот же файл одновременно.
Идея с каналом или перенаправлением состоит в том, что команда с левой и правой стороны каждого канала или перенаправления выполняется одновременно, параллельно. Команда справа обрабатывает информацию, передаваемую ей из команды слева, в то время как команда слева все еще выполняется.
Чтобы ваш сценарий работал, команда, которая читает из файла, должна завершиться до того, как начнется команда, которая записывает в файл. Для того, чтобы это работало, вам нужно сначала перенаправить вывод во временное местоположение, а затем, когда все будет готово, отправить его из временного местоположения обратно в файл.
Лучший способ сделать это, в основном, как в предыдущем примере, где вы перенаправляете во временный файл, а затем переименовываете этот файл обратно в исходный (за исключением того, что вам не нужно сначала удалять файл, потому что перемещение удаляет любую существующую цель) ,
Вы также можете сохранить его в строковую переменную, за исключением того, что он работает только тогда, когда данные достаточно малы, чтобы все сразу помещалось в память.
источник
cat filename | sort
простоsort filename
-cat
здесь не нужно.cat
может быть ненужным в этом случае, но я сосредоточился на части перенаправления.Вы можете использовать
tee
команду:Команда
tee
читает из стандартного ввода и записывает в стандартный вывод и файлы.источник
(cat ~/file | grep -v 3662 ; printentry 3662) | tee ~/file > /dev/null
работает. Как и в оригинальном сообщении, это не сработает, если вы просто> ~/file
безtee
. Ти похоже здесьsort -o file
, что пишет в названный файл без продолжения той же трубы.(cat x | grep -v 7 ; echo 7) | tee x > /dev/null; cat x
я рекомендую временный файл и,mv
возможно, решение по ссылке @ Steven.Вы можете использовать Vim в режиме Ex:
sort u
сортировать уникальноx
написать, если изменения были сделаны (они есть) и выйтиисточник