Mam plik pola o stałej szerokości, który próbuję posortować za pomocą narzędzia sortowania UNIX (w moim przypadku Cygwin).
Problem polega na tym, że na górze pliku znajduje się dwuwierszowy nagłówek, który jest sortowany do końca pliku (ponieważ każda linia nagłówka zaczyna się od dwukropka).
Czy istnieje sposób, aby powiedzieć sortowi, czy „przekaż pierwsze dwie linie przez nieposortowane”, albo określić kolejność, która sortuje dwukropki do góry - pozostałe wiersze zawsze zaczynają się 6-cyfrową liczbą (która jest właściwie kluczem I sortuję dalej), jeśli to pomoże.
Przykład:
:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
500123TSTMY_RADAR00
222334NOTALINEOUT01
477821USASHUTTLES21
325611LVEANOTHERS00
powinien sortować do:
:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
222334NOTALINEOUT01
325611LVEANOTHERS00
477821USASHUTTLES21
500123TSTMY_RADAR00
unix
sorting
command-line
Rob Gilliam
źródło
źródło
Odpowiedzi:
Nawiasy tworzą podpowłokę, zawijając standardowe wyjście, dzięki czemu można je potokować lub przekierować tak, jakby pochodziło z pojedynczego polecenia.
źródło
tee >(head -n $header_size) | tail -n +$header_size | sort
, ale wydaje się, że głowica biegnie zatail|sort
rurą, więc nagłówek zostaje wydrukowany na końcu. Czy jest to deterministyczne, czy stan rasy?cat
złożyć coś razem, w którym używasz do przekierowania stdin do pliku tymczasowego, a następnie uruchomić powyższe polecenie na tym nowym pliku, ale zaczyna być na tyle brzydki, że prawdopodobnie lepiej jest użyć jednego z rozwiązań opartych na awk podanych w inne odpowiedzi.Jeśli nie masz nic przeciwko używaniu
awk
, możesz skorzystaćawk
wbudowanych możliwości potokuna przykład.
Spowoduje to wydrukowanie pierwszych dwóch wierszy dosłownie, a resztę przekierowuje
sort
.Należy zauważyć, że ma to bardzo szczególną zaletę polegającą na możliwości selektywnego sortowania części potokowego wejścia. wszystkie inne sugerowane metody posortują tylko zwykłe pliki, które można odczytać wiele razy. To działa na wszystko.
źródło
$0
,print
wystarczy.Oto wersja, która działa na danych z potoku:
Jeśli twój nagłówek ma wiele linii:
To rozwiązanie jest stąd
źródło
extract_data | (read h; echo "$h"; sort)
, jest wystarczająco krótki, aby go zapamiętać. Twój przykład obejmuje więcej skrajnych przypadków. :) To najlepsza odpowiedź. działa na rurach. no awk.extract_data | (read; sort)
W prostych przypadkach
sed
potrafi wykonać pracę elegancko:lub równoważnie,
Klucz znajduje się w
1q
- wypisz pierwszą linię (nagłówek) i wyjdź (pozostawiając resztę danych wejściowychsort
).Na podany przykład
2q
wystarczy.-u
Przełącznik (niebuforowana) jest wymagana dla tychsed
S (zwłaszcza, GNU), że byłoby inaczej czytać wejście w kawałki, przez co zużywa dane, które chcesz przejśćsort
zamiast.źródło
Możesz użyć
tail -n +3 <file> | sort ...
(tail wyświetli zawartość pliku z trzeciej linii).źródło
przykład:
źródło
Zajmuje tylko 2 linie kodu ...
W przypadku danych liczbowych wymagane jest -n. W przypadku sortowania alfa opcja -n nie jest wymagana.
Przykładowy plik:
$ cat test.txt
Wynik:
$ cat a.tmp
źródło
Oto funkcja bash, w której argumenty są dokładnie takie same, jak sort. Obsługiwane pliki i potoki.
Jak to działa. Ta linia sprawdza, czy jest co najmniej jeden argument i czy ostatni argument jest plikiem.
To zapisuje plik do oddzielnego argumentu. Ponieważ mamy zamiar skasować ostatni argument.
Tutaj usuwamy ostatni argument. Ponieważ nie chcemy przekazywać tego jako argumentu sortowania.
Na koniec wykonujemy część awk, przekazując argumenty (bez ostatniego argumentu, jeśli był to plik) do sortowania w awk. Zostało to oryginalnie zasugerowane przez Dave'a i zmodyfikowane, aby przyjąć sortowanie argumentów. Polegamy na fakcie, że
$file
będzie pusty, jeśli będziemy podłączać rurociąg, a zatem zostaniemy zignorowani.Przykładowe użycie z plikiem oddzielonym przecinkami.
źródło
W Pythonie:
źródło
Oto funkcja powłoki bash pochodząca z innych odpowiedzi. Obsługuje zarówno pliki, jak i potoki. Pierwszym argumentem jest nazwa pliku lub „-” dla standardowego wejścia. Pozostałe argumenty są przekazywane do sortowania. Kilka przykładów:
Funkcja powłoki:
źródło
To jest to samo, co odpowiedź Iana Sherbina, ale moja realizacja to: -
źródło
To zrobi, co chcesz.
źródło