To jest proste, krótkie i łatwe do napisania, zrozumienia i sprawdzenia, a ja osobiście to lubię:
grep -oE '\S+$' file
grep
w Ubuntu , gdy jest wywoływany za pomocą -E
lub -P
, oznacza skrót, \s
że oznacza spację (w praktyce zwykle spację lub tabulator) i \S
oznacza wszystko, co nie jest jednym. Używając kwantyfikatora+
i kotwicy końca linii$
, wzór \S+$
dopasowuje jeden lub więcej niepustych znaków na końcu linii . Możesz użyć -P
zamiast -E
; znaczenie w tym przypadku jest takie samo, ale używany jest inny silnik wyrażeń regularnych , więc mogą mieć różne charakterystyki wydajności .
Jest to równoważne z komentarzem rozwiązania Avinash Raj (tylko z łatwiejszą, bardziej zwartą składnią):
grep -o '[^[:space:]]\+$' file
Te podejścia nie będą działać, jeśli po numerze mogą występować białe spacje . Można je modyfikować, ale robią to, ale nie widzę sensu w tym wchodzić. Chociaż czasem pouczające jest uogólnienie rozwiązania do pracy w większej liczbie przypadków, nie jest to praktyczne tak często, jak ludzie się przypuszczają, ponieważ zwykle nie ma sposobu, aby dowiedzieć się, na który z wielu różnych niekompatybilnych sposobów problem może ostatecznie wymagać uogólniać się.
Wydajność jest czasem ważnym czynnikiem. To pytanie nie określa, że dane wejściowe są bardzo duże i prawdopodobne jest, że każda opublikowana tutaj metoda jest wystarczająco szybka. Jednak w przypadku, gdy pożądana jest prędkość, oto mały punkt odniesienia dla pliku wejściowego o wartości dziesięciu milionów wierszy:
$ perl -e 'print((<>) x 2000000)' file > bigfile
$ du -sh bigfile
439M bigfile
$ wc -l bigfile
10000000 bigfile
$ TIMEFORMAT=%R
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
819.565
$ time grep -oE '\S+$' bigfile > bigfile.out
816.910
$ time grep -oP '\S+$' bigfile > bigfile.out
67.465
$ time cut -d= -f2 bigfile > bigfile.out
3.902
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
815.183
$ time grep -oE '\S+$' bigfile > bigfile.out
824.546
$ time grep -oP '\S+$' bigfile > bigfile.out
68.692
$ time cut -d= -f2 bigfile > bigfile.out
4.135
Uruchomiłem go dwa razy, na wypadek, gdyby kolejność miała znaczenie (jak to czasem bywa w przypadku zadań wymagających dużej ilości operacji we / wy) i ponieważ nie miałem dostępnej maszyny, która nie wykonywałaby w tle innych rzeczy, które mogłyby wypaczać wyniki. Na podstawie tych wyników wyciągam następujące wnioski, przynajmniej tymczasowo i dla plików wejściowych o rozmiarze, którego użyłem:
Łał! Przechodząc -P
(by użyć PCRE ) zamiast -G
(domyślnie, gdy nie jest określony dialekt) lub -E
wykonane grep
szybciej o ponad rząd wielkości. Dlatego w przypadku dużych plików lepiej użyć tego polecenia niż powyższe:
grep -oP '\S+$' file
ŁAŁ!! cut
Metoda w odpowiedzi αғsнιη za , jest ponad rząd wielkości szybciej niż nawet szybszą wersją mojej drodze! Był również zwycięzcą testu porównawczego pa4080 , który obejmował więcej metod niż to, ale przy mniejszym wkładzie - i dlatego wybrałem go spośród wszystkich innych metod do włączenia do mojego testu. Jeśli wydajność jest ważna lub pliki są ogromne, uważam, że należy zastosować metodę αғsнιη .cut -d= -f2 file
cut
Służy to również przypomnieniu, że nie należy zapominać o prostocie cut
i paste
narzędziach , i być może należy ją preferować, gdy ma to zastosowanie, mimo że istnieją bardziej wyrafinowane narzędzia, takie jak te, grep
które są często oferowane jako rozwiązania pierwszej linii (i że jestem osobiście bardziej przyzwyczajony do korzystania).
grep -o '[^[:space:]]\+$' file