AWK: como selecionar linhas pelo número de palavras em um campo?

5

Aqui está um arquivo de texto que eu tenho:

1|this|1000
2|that|2000
3|hello|3000
4|hello world|4000
5|lucky you|5000
6|awk is awesome|6000
.
.
.

Como eu imprimo somente as linhas que têm duas e somente duas palavras (linha 4 e 5) nos $ 2?

Isso é o que tentei, mas conta o número de letras em vez de palavras:

awk -F"|" '{if(length($2==2) print $0}'
    
por user3768495 31.10.2017 / 01:08

3 respostas

16

Você pode usar o valor de retorno da função awk split :

$ awk -F'|' 'split($2,a,"[ \t]+") == 2' file
4|hello world|4000
5|lucky you|5000
    
por 31.10.2017 / 01:13
1

Você também pode usar o valor de retorno da função gsub .

awk -F'|' '{l=$0} gsub(/[ \t]+/,"",$2)==1{print l}'
    
por 31.10.2017 / 10:23
1
awk '/^.+\|\w+ \w+\|/' input.txt

Explicação:

  • '/^.+\|\w+ \w+\|/' - todas as linhas em conformidade com este padrão serão impressas.
  • ^ - a partir do começo da linha.
  • .+ - um ou mais caracteres.
  • \| - caractere de canal. Deve ser escapado pela barra invertida por perceber literalmente, senão é processado como 'ou' sinal.
  • \w+ \w+\ - qualquer palavra, espaço e, em seguida, qualquer palavra ou, em outras palavras: palavra espaço palavra - exatamente o que você precisa.
  • \| - o segundo caractere de pipe.

Entrada

1|this|1000
2|that|2000
3|hello|3000
4|hello world|4000
5|lucky you|5000
6|awk is awesome|6000

Resultado

4|hello world|4000
5|lucky you|5000
    
por 31.10.2017 / 16:06