A linha de impressão tem formato e quantidade especial de vírgula

1

Esta é a minha amostra:

6751176513,ahggasda,3453453,hgdahgsd,hgfhgfhg,,
,,

ajhgdha | sajhsgdahj|sdahgdhjaghjsd
6751176513,ahggasda,gdfgdf,2015-10-20 05:15:25,sdfsd,,

Eu preciso imprimir as linhas que possuem este critério:

  1. Quantidade de commmas = 6

  2. o segundo campo deve ter valor (não NULL)

  3. o quarto campo deve ter formato de data e hora (AAAA-MM-DD HH: MI: SS)

Eu preciso usar "AWK" neste caso.

    
por Ahmed Samir 11.04.2015 / 13:51

2 respostas

1

Se você não se importa em usar uma combinação de awk e grep.

awk -F"," ' { 
       if ( $2 != "" && $4 ~ /[[:digit:]]{4}(-[[:digit:]]{2}){2} [[:digit:]]{2}(:[[:digit:]]{2}){2}/ ) print
} ' <file> | grep '.*,.*,.*,.*,.*,.*,.*'

EDIT: Uma alternativa ao awk Pure. Obrigado ao @Archemar por apontar isso.

awk -F"," ' {
       if ( NF == 7 && $2 != "" && $4 ~ /[[:digit:]]{4}(-[[:digit:]]{2}){2} [[:digit:]]{2}(:[[:digit:]]{2}){2}/ ) print
} ' <file>
    
por 11.04.2015 / 15:16
2

Você faria melhor apenas usar grep . Eu sei que um regexp como esse pode parecer assustador, mas fica melhor se você der um passo atrás.

__=[^,]* d=[0-9][0-9] y=$d$d m=$d

grep "^$__,${__%?}$__,$__,$y-$m-$d $d:$d:$d,$__,$__,$__$\
" <<\IN
6751176513,ahggasda,3453453,hgdahgsd,hgfhgfhg,,
,,

ajhgdha | sajhsgdahj|sdahgdhjaghjsd
6751176513,ahggasda,gdfgdf,2015-10-20 05:15:25,sdfsd,,
IN

Veja? Não é tão ruim assim - e até faz algum sentido. Esta é uma coisa que BREs (expressões regulares básicas) são muito bons para: fácil abstração de nível superior.

As impressões acima.

6751176513,ahggasda,gdfgdf,2015-10-20 05:15:25,sdfsd,,
    
por 11.04.2015 / 19:39

Tags