Como obter linhas de um arquivo csv que possuem apenas valores numéricos (sem letras em inglês)?

Como obter linhas de um arquivo csv que possuem apenas valores numéricos (sem letras em inglês)?

Quero obter linhas de arquivos CSV que incluam apenas números. Meu arquivo de entrada fica assim:

8.1.0,289,,,,,,,,,,,,,,,,
9,260,,,,,,,,,,,,,,,,
10,207,,,,,,,,,,,,,,,,
9,206,,,,,,,,,,,,,,,,
Note,8,,,,,,,,,,,,,,,,
10,194,,,,,,,,,,,,,,,,
8.1.0,184,,,,,,,,,,,,,,,,

ele deve conseguir que os números tenham o formato acima , como 9,, etc.9.0.08.1

Como posso usar csvgrepou awkcomando sedpara isso? O arquivo CSV possui duas colunas. Deve omitir as linhas que contenham qualquer letra.

Responder1

Usar awke para validar se todos os campos contêm números válidos e pular os campos vazios.

awk -F, '{ for(i=1; i<=NF; i++) if($i+0!=$i && $i!="") next }1' infile

Responder2

Você pode usar o grepcomando assim:

grep -v "[A-Za-z]" filename > filename.output

Aqui está o teste:

# cat zz2
1;2
a,1
2,B
                                                                                                                   
# grep -v "[A-Za-z]" zz2
1;2

Para filtrar linhas vazias você pode usar:

grep -v "[A-Za-z]" zz2 | grep -v '^$'

Responder3

LC_ALL=C grep -v '[^0123456789,.]' < in.csv > out.csv

Removeria as linhas que contêm qualquer caractere diferente de 0123456789,.. Com LC_ALL=C, garantimos que todas as sequências de bytes formem caracteres válidos. Na Clocalidade (mas geralmente não em outras localidades), deve ser seguro substituí-lo 0123456789por 0-9.

Para uma correspondência mais rigorosa que exige que as linhas sejam sequências de 0 ou mais ,campos separados consistindo em .listas separadas de 0 ou mais sequências de 1 ou mais dígitos decimais, com GNU grep, você pode fazer:

LC_ALL=C grep -xP '((\d+(\.\d+)*)?)(,(?1))*' < in.csv > out.csv

Ou POSIX:

number=[0123456789]+
field="($number(\\.$number)*)?"
LC_ALL=C grep -xE "$field(,$field)*" < in.csv > out.csv

Responder4

com sede o dcomando:

sed '/[a-zA-Z]/d' data 

Exclua toda a linha se pelo menos um caractere for encontrado.

Com awk:

awk '!/[a-zA-Z]/' data

Evite imprimir se pelo menos um caractere for encontrado dentro da linha.

informação relacionada