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?


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.


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

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

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.


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

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 {} \;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.