Это просто, кратко и легко написать, понять и проверить, и мне лично это нравится:
grep -oE '\S+$' file
grep
в Ubuntu , когда вызывается с помощью -E
или -P
, использует сокращение \s
для обозначения пробела (на практике обычно это пробел или табуляция) и \S
для обозначения всего, что не является единым целым . Используя квантификатор+
и привязку конца строки$
, шаблон \S+$
соответствует одному или нескольким непробелам в конце строки . Вы можете использовать -P
вместо -E
; смысл в этом случае тот же, но используется другой механизм регулярных выражений , поэтому они могут иметь разные характеристики производительности .
Это эквивалентно прокомментированному решению Avinash Raj (только с более простым и компактным синтаксисом):
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 , который охватывал больше методов, чем этот, но с меньшим вводом - и именно поэтому я выбрал его, из всех других методов, для включения в мой тест. Если производительность важна или файлы огромны, я думаю, что следует использовать метод αғsнιη .cut -d= -f2 file
cut
Это также служит напоминанием о том, что не следует забывать о простых cut
и paste
полезных утилитах , и, возможно, их следует отдавать предпочтение, когда это применимо, даже если есть более сложные инструменты, подобные grep
этим, часто предлагаются в качестве решений первой линии (и что я лично более привык к использованию).
grep -o '[^[:space:]]\+$' file