Я хочу извлечь последний столбец из строк, которые выглядят так:
880.952 NAV_Y uSimMarine -146.17516
Число не всегда отрицательное и не имеет фиксированной длины (т.е. не всегда имеет одинаковое количество десятичных знаков).
Это поможет мне проделать большую часть пути:
grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"
За исключением того, что оно также совпадает с числом в первом столбце.
Если я изменю это так, чтобы включить конец строки и исключить совпадения первого столбца:
grep -E "[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"
У меня нет совпадений, и я этого не понимаю.
Что я здесь упускаю?
решение1
Прикрепите выражение к концу строки:
grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"
Если вы добавите опцию PCRE для -o
возврата только захваченной группы, вы увидите, что ваш пример соответствует и возвращает желаемое совпадение:
grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$)"
-146.17516
Также, чтобы обнаружить совпадения для строк в файле с необязательными конечными пробелами, просто добавьте \s*
:
grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}\s*$)"
решение2
Перед первым регулярным выражением поставьте пробел:
grep -E "\s+-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"
Это должно сработать, поскольку исключает совпадение в начале строки.
Если ты хочешьтолько4-й столбец, вы можете легко добиться этого с помощью GNU sed:
sed -r 's/^\S+\s+\S+\s+\S+\s+(\S+)(\s.*|)$/\1/'
где \s
— любой пробельный символ (пробел, табуляция и различные «подачи» 1 ) и \S
непробельный символ, или (гораздо более понятным способом) с помощью sed | cut
:
sed 's/\s\+/\t/g' | cut -f4
который сначала сжимает все пробелы в одну вкладку, а затем использует cut
для вырезания четвертого столбца. Он также позволяет вам легко выбирать больше столбцов, например, с cut -f1,4
и так далее.
1) То есть: перевод страницы, перевод строки, возврат каретки, хотя средний из них обычно интерпретируется sed
как разделитель строк.