Somente imprimir linhas que tenham 2 ou mais campos?

3

Eu tenho um arquivo de texto e estou tentando descobrir como filtrar todas as linhas com dados em apenas 1 campo, deixando linhas com 2 campos. Eu me deparei com o seguinte código: awk '$NF > 1' , mas não consigo fazer funcionar como eu quero. Alguma idéia do que eu posso estar fazendo errado?

Aqui está uma amostra dos meus dados:

simpledaddy11,EastOfBrussels
simpledaddy11,thomaswatkins
simpledaddy11,
simpledaddy11,
simpledaddy11,
simpledaddy11,
simpledaddy11,
simpledaddy11,
simpledaddy11
Moral_Animal,EastOfBrussels
Moral_Animal,
Moral_Animal,
Moral_Animal,
Moral_Animal,
Moral_Animal,
Moral_Animal,
Moral_Animal,
Moral_Animal
skilur_ua,EastOfBrussels
skilur_ua,thomaswatkins
skilur_ua,
skilur_ua,
skilur_ua,
skilur_ua,

Aqui está o que eu quero terminar:

simpledaddy11,EastOfBrussels
simpledaddy11,thomaswatkins
Moral_Animal,EastOfBrussels
skilur_ua,EastOfBrussels
skilur_ua,thomaswatkins

Obrigado pela ajuda!

    
por CurtLH 06.03.2014 / 21:48

3 respostas

10

Se você deseja manter linhas com dados em pelo menos dois campos:

grep '[^,].*,[^,]'
    
por 06.03.2014 / 22:24
6

Você precisa alterar o separador de campo para uma vírgula. Além disso, você não deve ter um $ antes do NF , se desejar o número de campos ( $NF é o último campo). Finalmente, as linhas que terminam em vírgula são consideradas como tendo um segundo campo vazio, portanto, você deve excluir as linhas em que o último campo está em branco:

awk -F, 'NF>1 && $NF!=""'

Atualizar

Do comentário de Stephane, eu obviamente não estava lendo a pergunta corretamente. O awk para imprimir linhas contendo mais de um campo não vazio é mais complicado:

awk -F, '{ nonblank=0;
  for(i=1;i<=NF;i++){
    if($i!="") nonblank++
  }
  if(nonblank>1) print $0
}'

Para este propósito, a abordagem grep de Stephane é muito melhor.

    
por 06.03.2014 / 21:51
1

você deve:

  1. defina a vírgula como um "Separador de campos padrão",

  2. Pergunta se Número de campos for maior que 1 e se o campo número 2 tiver conteúdo.

  3. Imprima a linha completa (registrador) usando a variável $ 0.

  4. Seus dados são armazenados no arquivo: data-exercise.txt

Este é o código:

awk 'BEGIN{FS=",";}{if(NF>1 && $2!="") print $0;}' data-exercise.txt

    
por 04.05.2018 / 00:56

Tags