2014-09-27 5 views
-3

После выполнения команды cat mydata.txt | sort | uniq | > mydata.txt, почему файл mydata.txt имеет значение null?Сортировка трубопровода стирает файл

+0

Ваша команда не имеет смысла – meda

+1

потому что '| > 'это опечатка. Довольно уверен, что вы имеете в виду 'cat mydata.txt | сортировать | uniq> mydata.txt' – WhozCraig

+0

Попробуйте 'cat mydata.txt | сортировать | uniq> mydata.tx' – juanchopanza

ответ

1

Ответ: пробел между | и > mydata.txt подал вывод uniq в ничто и отправил его в файл.

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

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

Вы можете подтвердить simulataneous операции, наблюдая, что ваш компьютер работает от другого окна терминала, используя утилиты, как top или pstree

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

Как это:

cat mydata.txt | sort | uniq > tmp-mydata.txt 
mv tmp-mydata.txt mydata.txt 

Или, как @tripleee предполагает, команда вроде уже имеет функциональность Uniq, и можно использовать следующую команду:

sort -u -o mydata.txt mydata.txt

Как правило, запись в файл вы читаете из небезопасного, но, возможно, здесь сортировка хранит что-то внутренне.

+1

Или просто' sort -u -o mydata.txt mydata.txt' – tripleee

+0

Да, это похоже на работу. Как можно было бы знать, что это безопасно, кроме опыта/тестирования? На странице man здесь указано только, что -o устанавливает выходной файл. – Paul

+0

Если вы обнаружили ошибку, сообщите об этом. – tripleee

Смежные вопросы