awk + separador de campo de contagem em csv e número da linha de impressão

3

Temos arquivo csv com mais de 50000 linhas Este é apenas um exemplo

Dcccrev,wefrwvfr,rfregt,wr4f,rfvrv,ecxwec,ecfrv,rfrf
Grge,gtgr,frfrv,gthtgv,gerg5tgvrt,rvrfvtg,tgt,frfrf,rfrf
Drfrfr,t,tgtg,rf,rgr,grtg,tgt,gtgtg,rg
.
.
.

Minha tarefa é: no caso de números de separador "," Em cada linha não é igual a 7, em seguida, precisa imprimir o número da linha

É possível criar uma linha awk ou um perl liner para essa tarefa?

Sem usar eco ou gato que passam tempo

    
por yael 28.02.2017 / 15:37

2 respostas

4

Isso é bastante fácil com o awk. Você pode definir o delimitador para, com -F',' , em seguida, contar as colunas com NF. Para 7 vírgulas, precisaríamos de 8 campos e imprimir o número da linha atual com NR.

awk -F ',' 'NF != 8 {print NR}' test.txt

Conteúdo do test.txt

Dcccrev,wefrwvfr,rfregt,wr4f,rfvrv,ecxwec,ecfrv,rfrf
Grge,gtgr,frfrv,gthtgv,gerg5tgvrt,rvrfvtg,tgt,frfrf,rfrf
Drfrfr,t,tgtg,rf,rgr,grtg,tgt,gtgtg,rg

Saída

2
3
    
por 28.02.2017 / 15:44
2

O operador s /// do Perl (também pode ter usado o tr /// aka y ///) retorna o número de substituições que ele executou, o qual pode ser usado para encontrar o número de ",". Da mesma forma, o operador m // retorna o número de correspondências.

perl -lne 's/,//g == 7 or print $.'      yourfile
perl -lne 'print $. if 7 != (() = /,/g)' yourfile
sed   -ne 's/[^,]//g; /^.\{7\}$/!='      yourfile
    
por 01.03.2017 / 15:30

Tags