Це просто, коротко і легко писати, розуміти та перевіряти, і мені особисто це подобається:
grep -oE '\S+$' file
grep
в Ubuntu , коли викликається -E
або -P
, використовується скорочення \s
для позначення символу пробілу (на практиці зазвичай це пробіл або вкладка) і \S
означає все, що не є одним. Використовуючи квантор+
і якір кінця рядка$
, шаблон \S+$
узгоджується з одним або декількома непустими в кінці рядка . Ви можете використовувати -P
замість -E
; значення в цьому випадку однакове, але використовується інший двигун регулярних виразів , тому вони можуть мати різні експлуатаційні характеристики .
Це еквівалентно коментованому рішенням Авінаша Раджа (лише з легшим, компактнішим синтаксисом):
grep -o '[^[:space:]]\+$' file
Ці підходи не працюватимуть, якщо після числа може бути пробіл пробілу . Вони можуть бути модифіковані так, але вони не бачать сенсу займатися цим. Хоча іноді доцільно узагальнювати рішення для роботи в більшій кількості випадків, це не практично так часто, як люди схильні вважати, тому що зазвичай неможливо дізнатися, яким із багатьох різних несумісних способів проблема в кінцевому підсумку може знадобитися бути узагальненими.
Продуктивність іноді є важливою увагою. Це питання не передбачає, що введення дуже велике, і, ймовірно, кожен метод, розміщений тут, є досить швидким. Однак, якщо потрібна швидкість, ось невеликий орієнтир у вхідному файлі на десять мільйонів рядків:
$ 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
Я запускав його двічі на випадок, коли замовлення було важливим (як це іноді робиться для важких завдань вводу / виводу) і тому, що у мене не було машини, яка б не робила інших матеріалів у фоновому режимі, які могли б перекривити результати. З цих результатів я, принаймні попередньо, і для вхідних файлів того розміру, який я використовував, роблю наступне:
Оце Так! Проходження -P
(для використання PCRE ), а не -G
(за замовчуванням, коли не вказано діалект) або -E
зроблено grep
швидше на порядок. Тому для великих файлів може бути краще використовувати цю команду, ніж показана вище:
grep -oP '\S+$' file
ОГО!! cut
Метод в відповіді αғsнιη в , є більш ніж на порядок величини швидше , ніж навіть більш швидка версія мого шляху! Він був переможцем і в еталоні pa4080 , який охоплював більше методів, ніж цей, але з меншим вкладом - і саме тому я вибрав його, з усіх інших методів, щоб включити до свого тесту. Якщо важлива продуктивність або файли величезні, я думаю , що слід використовувати метод αғsnιη .cut -d= -f2 file
cut
Це також служить нагадуванням про те, що про прості cut
та paste
утиліти не слід забувати , і, можливо, їх слід віддавати перевагу, коли це можливо, навіть якщо є більш складні інструменти, такі grep
як часто пропонуються як рішення першого ряду (і що я особисто більше звик до використання).
grep -o '[^[:space:]]\+$' file