Quero extrair a última coluna de linhas semelhantes a:
880.952 NAV_Y uSimMarine -146.17516
O número nem sempre é negativo e não tem comprimento fixo (ou seja, nem sempre tem o mesmo número de casas decimais).
Isso me leva até lá:
grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"
Exceto que também corresponde ao número na primeira coluna.
Se eu alterar isso para incluir o final da linha para eliminar as correspondências da primeira coluna:
grep -E "[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"
Não consigo correspondências, o que não entendo.
O que estou perdendo aqui?
Responder1
Ancore a expressão no final da linha:
grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"
Se você adicionar a opção PCRE de -o
retornar apenas o grupo capturado, verá que seu exemplo corresponde e retorna a correspondência desejada:
grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$)"
-146.17516
Além disso, para capturar correspondências de linhas em um arquivo com espaço em branco opcional, basta adicionar \s*
como:
grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}\s*$)"
Responder2
Precedendo o primeiro regexp com um espaço:
grep -E "\s+-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"
deve funcionar, pois exclui a correspondência no início da linha.
Se você quiserapenasna quarta coluna, você pode conseguir isso facilmente com GNU sed:
sed -r 's/^\S+\s+\S+\s+\S+\s+(\S+)(\s.*|)$/\1/'
onde \s
está qualquer caractere de espaço em branco (espaço, tabulação e os vários "feeds" 1 ) e \S
um caractere que não seja espaço, ou (de uma forma muito mais limpa) com sed | cut
:
sed 's/\s\+/\t/g' | cut -f4
que primeiro compacta todos os espaços em uma única guia e depois corta cut
a quarta coluna. Também permite escolher mais colunas facilmente, por exemplo, com cut -f1,4
e assim por diante.
1) Ou seja: avanço de formulário, avanço de linha, retorno de carro, embora o do meio geralmente seja interpretado sed
como separador de linha.