Jak posortować plik na miejscu

205

Kiedy używamy sort filepolecenia, plik pokazuje jego zawartość w uporządkowany sposób, co jeśli nie chcę otrzymywać żadnego rodzaju danych wyjściowych, ale posortowany plik?

Ali Sajid
źródło
Zaktualizuj swoje pytanie, aby wyraźnie wyjaśnić, co chcesz zrobić z wynikiem sortowania pliku. Czy chcesz go posortować, zastępując nieposortowaną zawartość fileposortowaną zawartością tego samego pliku? Sposób, w jaki obecnie zadawane jest twoje pytanie, nic nie robienie jest poprawną odpowiedzią (nie chcesz żadnych wyników, więc nie rób nic).
Keith Thompson
@ KeithThompson dzięki za twoją troskę, tak naprawdę próbowałem posortować plik, ale chcę uniknąć wyświetlania na ekranie.
Ali Sajid
A więc gdzie chcesz, aby dane wyjściowe poszły? W nowy plik? Do oryginalnego pliku? Do drukarki w korytarzu?
Keith Thompson
1
Do pliku orignal
Ali Sajid
uruchom, sort infile >outfilea otrzymasz posortowane dane wyjściowe do pliku „outfile”. Następnie możesz usunąć oryginalny „infile” i wszystko będzie dobrze.
Luis Colorado,

Odpowiedzi:

408

Możesz użyć przekierowania pliku, aby przekierować posortowane dane wyjściowe:

sort input-file > output_file

Albo można użyć -o, --output=FILEopcja sortowania, aby wskazać ten sam plik wejściowy i wyjściowy:

sort -o file file

Uwaga: Częstym błędem jest próba przekierowania wyjścia do tego samego pliku wejściowego (np sort file > file.). To nie działa, ponieważ powłoka dokonuje przekierowań (nie program sort (1) ), a plik wejściowy (jako wynik również) zostanie skasowany tuż przed umożliwieniem programowi sort (1) odczytania go.

Sylvain Bugat
źródło
88
Dobra notatka na temat powszechnego błędu
Drakes
1
Jest to naprawdę przydatne, gdy trzeba ręcznie edytować słowniki dla LaTeX, +1
Bryson S.
6
Wystarczy wspomnieć o znaczeniu porządku. Ze GNU sortstrony informacyjnej: -o OUTPUT-FILE' --output = OUTPUT-FILE 'Zapisuje wyjście do PLIKU WYJŚCIOWEGO zamiast standardowego wyjścia. W nowszych systemach -o' cannot appear after an input file if POSIXLY_CORRECT 'jest ustawiony, np. sort F -o F'. Portable scripts should specify -O WYJŚCIE-PLIK' przed plikami wejściowymi.
Yassine ElBadaoui
14
Aby uniknąć powtarzania nazwy pliku:sort -o file{,}
tstenner
65

sortKomenda drukuje wynik sortowania pracy na standardowe wyjście domyślnie. Aby uzyskać sortowanie „na miejscu”, możesz to zrobić:

sort -o file file

To nadpisuje dane wejściowe fileposortowanym wyjściem. -oPrzełącznik, używany do określenia wyjścia, jest zdefiniowany przez POSIX , więc powinny być dostępne dla wszystkich wersji sort:

-o Podaj nazwę pliku wyjściowego, który będzie używany zamiast standardowego wyjścia. Ten plik może być taki sam jak jeden z plików wejściowych.

Jeśli masz nieszczęście, aby mieć wersję sortbez -oprzełącznika ( Luis zapewnia mnie, że istnieją), możesz uzyskać edycję „w miejscu” w standardowy sposób:

sort file > tmp && mv tmp file
Tom Fenech
źródło
2
+ ^ za najlepszą odpowiedź, a także z dwuznacznym pytaniem, ale wciąż na pierwszym miejscu, więc należy poprawić.
u2n
6
sort file | sponge file

To jest w następującym pakiecie Fedory:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge
SilverlightFox
źródło
1
Działa to również na Ubuntu po instalacji zsudo apt install moreutils
Serge Stroobandt
4

Aby posortować plik na miejscu, spróbuj:

echo "$(sort your_file)" > your_file

Jak wyjaśniono w innych odpowiedziach, nie można bezpośrednio przekierować wyjścia z powrotem do pliku wejściowego. Ale możesz ocenićsort polecenie, a następnie przekierować je z powrotem do oryginalnego pliku. W ten sposób możesz zaimplementować sortowanie na miejscu.

Podobnie możesz zastosować tę sztuczkę do innego polecenia, np. pasteZaimplementować dołączanie wierszy.

Bo Tian
źródło
1
Jest to złe, ponieważ nie działa w przypadku dużych plików, pasków kończących znaki nowej linii, echomoże bałaganować ucieczkami ukośnika odwrotnego w POSIX i -odziała dla tego samego pliku jako danych wejściowych, jak wyjaśniono na stronie: stackoverflow.com/a/29244387/895245
Ciro Santilli 郝海东8 病 六四 事件 法轮功
4

Oto podejście, które wykorzystuje (ab) vim:

vim -c :sort -c :wq -E -s "${filename}"

Te -c :sort -c :wqpolecenia wywołuje porcji do vim po otwarciu pliku. -Ei -ssą niezbędne, aby vim działał w trybie „bezgłowym”, który nie zwraca się do terminala.

Nie ma to prawie żadnych korzyści w porównaniu z tym sort -o "${filename}" "${filename}"podejściem, z wyjątkiem tego, że bierze argument nazwy pliku tylko raz.


Przydało mi się to zaimplementować formatterdyrektywę we nanorcwpisie dotyczącym .gitignoreplików. Oto, czego użyłem do tego:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s
Anthony Sottile
źródło
4
Używasz vima w swoim nanorc? O ironia.
Brett Holman
2

Czy chcesz posortować wszystkie pliki w folderze i zastąpić je w podfolderze?

Użyj tego:

find . -type f -exec sort {} -o {} \;
luandrea
źródło