A sort
musi zobaczyć wszystkie dane wejściowe, zanim będzie można rozpocząć wyprowadzanie. Z tego powodu sort
program może łatwo oferować opcję modyfikacji pliku w miejscu:
sort temp.txt -o temp.txt
W szczególności dokumentacja GNUsort
mówi:
Zwykle sort czyta wszystkie dane wejściowe przed otwarciem pliku-wyjściowego, więc możesz bezpiecznie posortować plik w miejscu, używając poleceń takich jak sort -o F F
i cat F | sort -o F
. Jednak za sort
pomocą --merge
( -m
) można otworzyć plik wyjściowy przed odczytaniem wszystkich danych wejściowych, więc polecenie takie jak cat F | sort -m -o F - G
nie jest bezpieczne, ponieważ sortowanie może rozpocząć zapisywanie F
przed zakończeniem cat
odczytu.
Podczas gdy dokumentacja BSD sort
mówi:
Jeśli [] plik-wyjściowy jest jednym z plików wejściowych, sort kopiuje go do pliku tymczasowego przed sortowaniem i zapisaniem wyniku do [] pliku-wyjściowego.
Polecenia, takie jak uniq
mogą rozpocząć zapisywanie danych wyjściowych, zanim zakończą odczytywanie danych wejściowych. Te polecenia zazwyczaj nie obsługują edycji lokalnej (i byłoby im trudniej obsługiwać tę funkcję).
Zwykle omijasz ten problem z plikiem tymczasowym lub jeśli absolutnie chcesz uniknąć posiadania pliku pośredniego, możesz użyć bufora do przechowywania pełnego wyniku przed jego wypisaniem. Na przykład z perl
:
uniq temp.txt | perl -e 'undef $/; $_ = <>; open(OUT,">temp.txt"); print OUT;'
Tutaj część perla odczytuje pełne dane wyjściowe ze uniq
zmiennej, $_
a następnie zastępuje oryginalny plik tymi danymi. Możesz zrobić to samo w wybranym języku skryptowym, być może nawet w Bash. Pamiętaj jednak, że będzie potrzebować wystarczającej ilości pamięci do przechowywania całego pliku, nie jest to zalecane podczas pracy z dużymi plikami.