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
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}'
Você também pode usar o valor de retorno da função gsub
.
awk -F'|' '{l=$0} gsub(/[ \t]+/,"",$2)==1{print l}'
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
Tags text-processing awk