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.0
8.1
¿Cómo puedo usar el comando or csvgrep
para esto? El archivo CSV tiene dos columnas. Debe omitir las líneas que contengan alguna letra.awk
sed
Respuesta1
Utilice awk
y 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 grep
comando, 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 C
configuración regional (pero a menudo no en otras configuraciones regionales), debería ser seguro reemplazarlo 0123456789
con 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 sed
y el d
comando:
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.