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.0
8.1
Como posso usar csvgrep
ou awk
comando sed
para isso? O arquivo CSV possui duas colunas. Deve omitir as linhas que contenham qualquer letra.
Responder1
Usar awk
e 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 grep
comando 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 C
localidade (mas geralmente não em outras localidades), deve ser seguro substituí-lo 0123456789
por 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 sed
e o d
comando:
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.