sort
Повинен бачити все вхідні дані, перш ніж він може почати виведення. З цієї причини sort
програма може легко запропонувати можливість змінити файл на місці:
sort temp.txt -o temp.txt
Зокрема, документація GNUsort
говорить:
Як правило, сортування зчитує всі вхідні дані перед відкриттям вихідного файлу, тож ви можете сміливо сортувати файл на місці, використовуючи команди типу sort -o F F
та та cat F | sort -o F
. Однак за sort
допомогою --merge
( -m
) можна відкрити вихідний файл перед читанням усіх вхідних даних, тому команда на зразок cat F | sort -m -o F - G
не є безпечною, оскільки сортування може почати писати, F
перш ніж cat
буде прочитано її.
Хоча в документації BSD sort
сказано:
Якщо вихідний файл [the] є одним із вхідних файлів, відсортуйте його до тимчасового файлу, перш ніж сортувати та записувати вихід у вихідний файл.
Такі команди, як, наприклад, uniq
можуть почати записувати вихід, перш ніж закінчити читання вводу. Ці команди, як правило, не підтримують редагування на місці (і їм буде складніше підтримувати цю функцію).
Зазвичай ви обходите це тимчасовим файлом, або якщо ви абсолютно хочете уникати проміжного файлу, ви можете використовувати буфер для зберігання повного результату перед його написанням. Наприклад, за допомогою perl
:
uniq temp.txt | perl -e 'undef $/; $_ = <>; open(OUT,">temp.txt"); print OUT;'
Тут частина Perl зчитує повний вихід з uniq
змінної, $_
а потім перезаписує вихідний файл із цими даними. Ви можете зробити те ж саме на мові сценаріїв, яку ви обрали, можливо, навіть на Bash. Але зауважте, що для зберігання всього файлу знадобиться достатньо пам'яті, це не доцільно при роботі з великими файлами.