Otrzymuję dane wyjściowe z programu, który najpierw tworzy jeden wiersz, który jest wiązką nagłówków kolumn, a następnie wiązką wierszy danych. Chcę wyciąć różne kolumny tego wyjścia i wyświetlić je posortowane według różnych kolumn. Bez nagłówka odcinające i sortowania jest łatwo realizowane poprzez -k
opcji sort
wraz z cut
lub awk
aby podzbiór kolumn. Jednak ta metoda sortowania miesza nagłówki kolumn z resztą wierszy danych wyjściowych. Czy istnieje prosty sposób na utrzymanie nagłówków na górze?
text-processing
sort
table
Jerry
źródło
źródło
{ head -1; sort; }
. Zawsze usuwa wiązkę tekstu po pierwszym wierszu. Czy ktoś wie, dlaczego tak się dzieje?head
wczytuje więcej niż jedną linię do bufora i wyrzuca większość. Mójsed
pomysł miał ten sam problem.lseek
możliwością wprowadzania danych, więc nie będzie działać podczas odczytu z potoku. Działa, jeśli przekierujesz do pliku,>outfile
a następnie uruchomisz{ head -n 1; sort; } <outfile
Odpowiedzi:
Kradzież pomysłu Andy'ego i uczynienie go funkcją, która jest łatwiejsza w użyciu:
Teraz mogę zrobić:
źródło
ps -C COMMAND
może być bardziej odpowiednie niżgrep COMMAND
, ale to tylko przykład. Nie-C
możesz także użyć, jeśli użyłeś innej opcji wyboru, takiej jak-U
.body
? Jak wbody sort
lubbody grep
. Myśli?header
nabody
, ponieważ wykonujesz akcję na ciele. Mam nadzieję, że to ma większy sens.body
wszystkich kolejnych uczestników rurociągu:ps -o pid,comm | body grep less | body sort -k1nr
<foo body sort -k2
lubbody sort -k2 <foo
. Tylko jedna dodatkowa postać z tego, czego chciałeś.Możesz utrzymać nagłówek na górze w następujący sposób dzięki bash:
Lub zrób to za pomocą Perla:
źródło
{}
porządku zamiast()
?IFS=
wyłącza dzielenie słów podczas czytania danych wejściowych. Nie uważam, żeby to było konieczne podczas czytania$REPLY
.echo
rozwinie ukośniki odwrotne, jeślixpg_echo
jest ustawiony (nie domyślny);printf
w takim przypadku jest bezpieczniejszy.echo $REPLY
bez cudzysłowów zagęści białe znaki; Myślę, żeecho "$REPLY"
powinno być dobrze.read -r
jest potrzebny, jeśli dane wejściowe mogą zawierać znaki ucieczki odwrotnego ukośnika. Niektóre z nich mogą zależeć od wersji bash.read REPLY; echo $REPLY
(usuwa spacje) iread; echo $REPLY
(nie).xpg_echo
zależy od twojego systemu, np. W Solarisie Myślę, że domyślnie jest to prawda. Właśnie dlatego Gillesprintf
tak bardzo lubi : to jedyna rzecz o przewidywalnym zachowaniu.Znalazłem fajną wersję awk, która działa dobrze w skryptach:
źródło
sort
polecenie zewnętrznie? Czy ktoś zna przynajmniej link do strony wyjaśniającej użycie potoku w awk?Hackish, ale skuteczny: poprzedzaj sortowanie
0
wszystkimi wierszami nagłówka i1
wszystkimi innymi wierszami. Rozbierz pierwszą postać po sortowaniu.źródło
Oto niektóre szumy magicznej linii perlowej, przez które można przesyłać dane wyjściowe, aby posortować wszystko, ale pierwszą linię należy trzymać na górze:
perl -e 'print scalar <>, sort <>;'
źródło
Wypróbowałem
command | {head -1; sort; }
rozwiązanie i mogę potwierdzić, że to naprawdę psuje rzeczy -head
odczytuje z rury wiele wierszy, a następnie wyprowadza tylko pierwszy. Tak więc reszta danych wyjściowych, którehead
nie zostały odczytane, jest przekazywana do -sort
NIE reszty danych wyjściowych począwszy od wiersza 2!W rezultacie brakuje linii (i jednej linii częściowej!), Które były na początku danych wyjściowych polecenia (z wyjątkiem tego, że nadal masz pierwszą linię) - fakt ten łatwo potwierdzić, dodając potok
wc
na końcu powyższy rurociąg - ale niezwykle trudno jest go wyśledzić, jeśli nie wiesz! Spędziłem co najmniej 20 minut próbując dowiedzieć się, dlaczego miałem częściową linię (pierwsze 100 bajtów odciętą) w moich wynikach przed jej rozwiązaniem.Skończyło się na tym, że działało pięknie i nie wymagało dwukrotnego uruchomienia polecenia:
Jeśli chcesz umieścić dane wyjściowe w pliku, możesz to zmodyfikować, aby:
źródło
head
wbudowanego ksh93 lubline
narzędzia (w systemach, które wciąż go mają) lubgnu-sed -u q
alboIFS=read -r line; printf '%s\n' "$line"
, które odczytują wejściowy bajt po jednym, aby tego uniknąć.Myślę, że to jest najłatwiejsze.
lub ten, który jest prawdopodobnie szybszy, ponieważ nie tworzy sub-powłoki
Inne fajne zastosowania
losuj linie po wierszu nagłówka
odwróć linie po wierszu nagłówka
źródło
cat file | { head -n 1 ; sort ; } > file2
pokaż tylko głowęźródło
command
dwa razy. Dlatego ogranicza się do niektórych konkretnych poleceń. Jednak dla żądanegops
polecenia w tym przykładzie zadziałałoby.Prosty i bezpośredni!
źródło
command
dwa razy. Tak naprawdę nie nadaje się do użycia w rurociągu.Przybyłem tutaj, szukając rozwiązania dla polecenia
w
. To polecenie pokazuje szczegółowe informacje o tym, kto jest zalogowany i co robi.Aby pokazać posortowane wyniki, ale z nagłówkami trzymanymi na górze (są 2 linie nagłówków), zdecydowałem się na:
Oczywiście uruchamia to polecenie
w
dwukrotnie i dlatego może nie być odpowiednie dla wszystkich sytuacji. Jednak na jego korzyść jest znacznie łatwiej zapamiętać.Zauważ, że
tail -n +3
oznacza „pokaż wszystkie linie od 3-go roku” (zobaczman tail
szczegóły).źródło
Spróbuj zrobić:
źródło