мой текстовый файл выглядит так:
Liquid penetration 95% mass (m) = 0.000205348
Liquid penetration 95% mass (m) = 0.000265725
Liquid penetration 95% mass (m) = 0.000322823
Liquid penetration 95% mass (m) = 0.000376445
Liquid penetration 95% mass (m) = 0.000425341
Теперь я хочу удалить Liquid penetration 95% mass (m)
из моих строк, чтобы получить только значения. Как я должен это делать?
grep -o '[^[:space:]]\+$' file
\S+$
либо либо,-E
либо-P
.) Так что решение такого рода не является медленным по своей сути. Но я до сих пор не могу получить его где - нибудь близко к αғsнιη поcut
методу , который выиграл свой тест тоже.Ответы:
Если есть только один
=
знак, вы можете удалить все раньше, в том числе=
и так:Если вы хотите изменить исходный файл, используйте
-i
опцию после тестирования:Примечания
-r
использовать ERE, поэтому мы не должны убегать(
и)
s/old/new
заменитьold
наnew
.*
любое количество любых символов(things)
сохранитьthings
на обратную ссылку позже\1
,\2
и т.д.источник
s/^.*= //
будет работать одинаково хорошо, так как правильное значение находится в конце строки.\1
т.д., имеет некоторую ценность для людей, которыеЭто работа для
awk
; при условии, что значения встречаются только в последнем поле (согласно вашему примеру):NF
являетсяawk
переменной, расширяется до количества полей в записи (строка), следовательно$NF
(обратите внимание на$
перед) содержит значение последнего поля.Пример:
источник
Я решил сравнить различные решения, перечисленные здесь. Для этого я создал большой файл, основанный на контенте, предоставленном OP:
Я создал простой файл с именем
input.file
:Затем я выполнил этот цикл:
Окно терминала было заблокировано. Я выполнил
killall tee
из другого терминала. Затем я проверил содержимое файла с помощью команд:less input.file
иcat input.file
. Выглядело хорошо, кроме последней строчки. Поэтому я удалил последнюю строку и создал резервную копию:cp input.file{,.copy}
(из-за команд, использующих параметр inplace ).Окончательное количество строк в файле
input.file
- 2 192 473 . Я получил этот номер по командеwc
:Вот результат сравнения:
grep -o '[^[:space:]]\+$'
sed -ri 's/.* = (.*)/\1/'
В качестве альтернативы, если мы перенаправим вывод в новый файл, команда будет быстрее:
gawk '{gsub(".*= ", "");print}'
rev | cut -d' ' -f1 | rev
grep -oP '.*= \K.*'
sed 's/.*= //'
(соответственно-i
опция делает команду в несколько раз медленнее)perl -pe 's/.*= //'
(-i
опция не дает большой разницы в производительности)awk '{print $NF}'
cut -c 35-
cut -d= -f2
Источник идеи.
источник
cut -d= -f2
решение побеждает. ха-хаwc -l
вывести три числа? Когда никакие другие параметры не передаются, эта-l
опция должна подавлять все, кроме количества строк.wc
Действительно ли отображались эти пробелы? Существуют ли языковые настройки, для которых он это сделает?) Спасибо за обновление!wc
еще раз. Я не знаю, где мой ум был сегодня рано, но я действительно не мог их понять. Так что, действительно, пробелы были разделителями групп цифр , иwc
не добавляли их :)С
grep
и-P
за то, чтоPCRE
(Интерпретируйте рисунок в виде P erl- C ompatible R Регулярная E Xpression) и-o
печатать только согласованный шаблон.\K
Уведомит будет игнорировать соответствие часть приходят перед собой.Или вы можете использовать
cut
команду вместо этого.источник
cut
Поскольку префикс строки всегда имеет одинаковую длину (34 символа), вы можете использовать
cut
:источник
Обратитесь к содержимому файла с помощью
rev
, перенаправьте выводcut
с пробелом в качестве разделителя и 1 в качестве целевого поля, затем снова измените его, чтобы получить исходное число:источник
Это просто, кратко и легко написать, понять и проверить, и мне лично это нравится:
grep
в Ubuntu , когда вызывается с помощью-E
или-P
, использует сокращение\s
для обозначения пробела (на практике обычно это пробел или табуляция) и\S
для обозначения всего, что не является единым целым . Используя квантификатор+
и привязку конца строки$
, шаблон\S+$
соответствует одному или нескольким непробелам в конце строки . Вы можете использовать-P
вместо-E
; смысл в этом случае тот же, но используется другой механизм регулярных выражений , поэтому они могут иметь разные характеристики производительности .Это эквивалентно прокомментированному решению Avinash Raj (только с более простым и компактным синтаксисом):
Эти подходы не сработают, если после числа могут стоять пробелы . Они могут быть изменены, чтобы они сделали, но я не вижу смысла вдаваться в это здесь. Хотя иногда поучительно обобщать решение для работы в большем количестве случаев, нецелесообразно делать это почти так часто, как полагают люди, потому что обычно нет никакого способа узнать, каким из множества несовместимых способов в конечном итоге может понадобиться проблема быть обобщенным.
Производительность иногда является важным фактором. Этот вопрос не предусматривает, что входные данные очень велики, и вполне вероятно, что каждый опубликованный здесь метод достаточно быстр. Однако, если скорость требуется, вот небольшой тест для входного файла из десяти миллионов строк:
Я запускал его дважды в случае, если порядок имел значение (как это иногда бывает для задач, связанных с вводом / выводом), и потому, что у меня не было машины, которая не выполняла другие операции в фоновом режиме, которые могли бы исказить результаты. Из этих результатов я делаю следующие выводы, по крайней мере, предварительно и для входных файлов того размера, который я использовал:
Вот это да! Передача
-P
(для использования PCRE ), а не-G
(по умолчанию, когда диалект не указан) или-E
выполняетсяgrep
быстрее на порядок. Поэтому для больших файлов может быть лучше использовать эту команду, чем приведенную выше:ВАУ!!
cut
Метод в ответе αғsнιη в , является более чем на порядок величины быстрее , чем даже более быстрая версия моего пути! Он также стал победителем в тесте PA4080 , который охватывал больше методов, чем этот, но с меньшим вводом - и именно поэтому я выбрал его, из всех других методов, для включения в мой тест. Если производительность важна или файлы огромны, я думаю, что следует использовать метод αғsнιη .cut -d= -f2 file
cut
Это также служит напоминанием о том, что не следует забывать о простых
cut
иpaste
полезных утилитах , и, возможно, их следует отдавать предпочтение, когда это применимо, даже если есть более сложные инструменты, подобныеgrep
этим, часто предлагаются в качестве решений первой линии (и что я лично более привык к использованию).источник
perl
- s ubstitute шаблона/.*= /
с пустой строкой//
:От
perl --help
:sed
- заменить шаблон пустой строкой:или (но медленнее, чем указано выше) :
gawk
- заменить шаблон".*= "
пустой строкой""
:От
man gawk
:источник