Tengo un archivo cuyo contenido se parece a este.
2,0,-1.8433679676403103,0.001474487996447893
3,1,0.873903837905657,0.6927701848899038
1,1,-1.700947426133768,1.5546514434152598
CSV con cuatro columnas cuya tercera y última columna son flotantes.
Quiero deshacerme de toda la parte de los números (incluido el signo) y conservar solo los tres primeros dígitos de la parte decimal para que la muestra anterior se convierta en
2,0,843,001
3,1,873,692
1,1,700,554
¿Cómo puedo hacer esto?
Respuesta1
sed 's/-\{,1\}[0-9]*\.\([0-9]\{,3\}\)[0-9]*/\1/g' file
Esto busca cadenas que comiencen con un opcional -
seguido de cualquier número de dígitos seguido de un punto, seguido de cualquier número de dígitos de los cuales seleccionará los primeros tres.
Otra forma es reemplazar [0-9]
con [[:digit:]]
as
sed 's/-\{,1\}[[:digit:]]*\.\([[:digit:]]\{,3\}\)[[:digit:]]*/\1/g' file
Respuesta2
Usando awk
:
awk -F[,.] '{print $1","$2","substr($4,1,3)","substr($6,1,3)}' file
Donde -F
se usa para establecer los FS
valores en coma ,
y punto.
substr
imprimirá los 3 dígitos requeridos después del punto.
Respuesta3
mal? ¿Por qué no Python?
import csv
filename = <yourfilenamehere>
for line in list(csv.reader(open(filename, 'r'))):
extra = [str(int((abs(float(num)) % 1) * 1000)).zfill(3) for num in line[2:]]
print(*(line[:2] + extra), sep=',')
Respuesta4
$ perl -lne 'print join " ", /\.\K(...)/g' file