¿Cómo obtener filas de un archivo csv que solo tienen valores numéricos (sin letras en inglés)?

¿Cómo obtener filas de un archivo csv que solo tienen valores numéricos (sin letras en inglés)?

Quiero obtener filas de archivos CSV que solo incluyan números. Mi archivo de entrada se ve así:

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

Debería poder obtener los números que tienen el formato anterior como 9, etc.9.0.08.1

¿Cómo puedo usar el comando or csvgreppara esto? El archivo CSV tiene dos columnas. Debe omitir las líneas que contengan alguna letra.awksed

Respuesta1

Utilice awky para validar que todos los campos contengan números válidos y omita los campos vacíos.

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

Respuesta2

Puedes usar el grepcomando, así:

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

Aquí está la prueba:

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

Para filtrar líneas vacías puedes usar:

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

Respuesta3

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

Eliminaría las líneas que contengan cualquier carácter que no sea 0123456789,.. Con LC_ALL=C, nos aseguramos de que todas las secuencias de bytes formen caracteres válidos. En la Cconfiguración regional (pero a menudo no en otras configuraciones regionales), debería ser seguro reemplazarlo 0123456789con 0-9.

Para una coincidencia más estricta que exija que las líneas sean secuencias de 0 o más ,campos separados que constan de .listas separadas de 0 o más secuencias de 1 o más dígitos decimales, con GNU grep, puede hacer:

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

O POSIX:

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

Respuesta4

con sedy el dcomando:

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

Elimina toda la línea si se encuentra al menos un carácter.

Con awk:

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

Evite imprimir si se encuentra al menos un carácter dentro de la línea.

información relacionada