echo -e 'one two three\nfour five six\nseven eight nine'
one two three
four five six
seven eight nine
jak mogę zrobić trochę „MAGIC”, aby uzyskać ten wynik ?:
three
six
nine
AKTUALIZACJA: Nie potrzebuję tego w ten konkretny sposób, potrzebuję ogólnego rozwiązania, aby bez względu na to, ile kolumn jest w rzędzie, np .: awk zawsze wyświetla ostatnią kolumnę.
text-processing
awk
LanceBaynes
źródło
źródło
Odpowiedzi:
Może nawet być wykonane tylko z
'bash'
, bez'sed'
,'awk'
lub'perl'
:źródło
... | while read -r line; do echo ${line##* }; done
bash
indeks tablicy jest przedmiotem oceny arytmetycznej, więcecho ${line[nb - 1]}
wystarczy. Jak mówić obash
, można po prostu pominąć rzeczy „NB”:echo ${line[-1]}
. Bardziej przenośne alternatywa później:echo ${line[@]: -1]}
. (Zobacz komentarz Stephane Chazelas na temat negatywnych indeksów w innym miejscu.)Próbować:
źródło
ps -ef | awk '{ print $NF }'
niektóre linie zostały obcięte ...) Perl nie ma tego ograniczenia. ( gnu.org/software/autoconf/manual/autoconf-2.67/html_node/… : „Tradycyjny Awk ma limit 99 pól w rekordzie. Ponieważ niektóre implementacje Awk, takie jak Tru64, dzielą dane wejściowe, nawet jeśli nie odwołujesz się w dowolnym polu skryptu, aby obejść ten problem, ustaw „FS” na nietypową postać i użyj podziału. ”)awk
implementacje mają to ograniczenie? Nigdy tego nie widziałem. Mojamawk
dusi się,32768
ale mojagawk
iigawk
może szczęśliwie poradzić sobie z milionami. Nawet mój busyboxawk
radzi sobie z milionami. Nigdy nie spotkałem czegoś,awk
co nie poradziłoby sobie ze 100 polami, w końcu to niewielka liczba. Czy jesteś pewien, że informacje są nadal aktualne? Nawet w systemie Solaris?To łatwiejsze niż myślisz.
źródło
Spróbuj
grep
(krótszy / prostszy, ale 3 razy wolniejszy niż zawk
powodu użycia wyrażenia regularnego):Lub
ex
(jeszcze wolniej, ale drukuje cały bufor po zakończeniu, bardziej przydatny, gdy trzeba go posortować lub edytować na miejscu):Aby zmienić na miejscu, zamień
-sc'%p|q!'
z-scwq
.Lub
bash
:Wydajność
Biorąc pod uwagę wygenerowany plik 1GB przez:
Przeprowadziłem statystyki czasu analizowania (uruchomiłem ~ 3x i wziąłem najniższą, przetestowaną na MBP OS X):
za pomocą
awk
:za pomocą
grep
:za pomocą
perl
:za pomocą
rev
+cut
:za pomocą
ex
:za pomocą
bash
:źródło
źródło
-a
:, automatyczne dzielenie pól na@F
tablicę;-l
odcina$/
(separator rekordów wejściowych) i zapisuje go w$\
(separator rekordów wyjściowych). Ponieważ nie podano liczby ósemkowej-l
, oryginał$/
jest drukowany (zakończenia linii);-n
kod pętli;-e
natychmiast wykonaj kod. Zobaczyćman perlrun
.Można to również zrobić za pomocą
'sed'
:Aktualizacja:
lub prościej:
źródło
Lub używając
cut
:chociaż nie spełnia to wymogu „ogólnego rozwiązania”. Używając
rev
dwa razy, możemy rozwiązać to również:źródło
rev
nie działa z „szerokimi” znakami, tylko z jednobajtowymi, o ile wiem.Za pomocą
awk
możesz najpierw sprawdzić, czy jest co najmniej jedna kolumna.źródło
awk 'NF{print $NF}'
.W Perlu można to zrobić w następujący sposób:
wydajność:
Możesz również przejść przez plik, oto przykładowy skrypt, który napisałem, aby przeanalizować plik o nazwie budżet.dat
przykładowe dane w budget.dat:
(widać, że potrzebowałem przechwycić tylko „ostatnią” kolumnę, a nie tylko kolumnę 2)
Scenariusz:
źródło