awk com regex para delimitador

2

Eu quero obter a primeira palavra em cada linha de um arquivo. Infelizmente muitas linhas começam com espaço (s). Então eu tento obter a primeira palavra com o seguinte:

awk -F'[ \t]+' '{print $1}' < MyFile.txt , mas não está funcionando. Eu tento este echo " some string: here" | awk -F'[ \t]+' '{print $1}' e os resultados são em branco (coisa que imprime string vazia). Então, por que isso não está funcionando? Eu quero fazer isso funciona com o comando awk e explicitamente passado delimiter (com fins educacionais)

Obrigado antecipadamente.

    
por DPM 10.01.2017 / 15:24

3 respostas

0

awk ignora os espaços em branco iniciais ao atribuir campos e o comando padrão é impresso. Então, isso deve funcionar bem:

awk '{print $1}'
    
por 10.01.2017 / 21:01
0

Você está especificando um separador de campo para o Awk que é composto por pelo menos um espaço ou um caractere de tabulação.

Você alimenta a string " some string: here" no Awk e pede para imprimir o primeiro campo.

Você não obtém saída porque o primeiro campo está vazio.

Os campos nessa string são

<1:>   <2:some> <3:string:> <4:here>

$ echo '   some string: here' | gawk 'BEGIN {OFS="|";FS="[ \t]+"}{print $1,$2,$3,$4}'
|some|string:|here

É mais visível com dados de entrada separados por vírgulas, como

,some,string:,here

Note também que usar uma expressão regular para FS é uma extensão para Awk, implementada no GNU Awk e Mawk.

    
por 11.01.2017 / 10:53
0

No awk, o separador de campos padrão -F " " ou BEGIN{FS=" "} segue uma convenção especial

  • (1) espaços iniciais e espaços finais são ignorados
  • (2) divisões por [ \t]+

Ponto (1) - ignorando espaços iniciais / finais - é só aplicar quando o separador de campos é exatamente " " .

Esse comportamento é, na verdade, o que esperamos.

O awk '{print $1}' padrão funciona encontrar e por isso awk -F' ' '{print $1}' .

Existe outra convenção semelhante para o separador de registro de entrada (RS): quando RS="" significa separação de parágrafos:

  • (1) separador é uma ou mais linhas vazias
  • (2) linhas vazias iniciais e finais são ignoradas.

Ponto (2) - ignorando linhas vazias iniciais / finais - aplica-se apenas quando o separador de registro de entrada é exatamente "" .

    
por 10.01.2017 / 17:52