Me gustaría calcular un valor en cada línea de un archivo como este:
1 1441792,11534336
2 1048576,8388608
3 1441792,1153433
4 1966080,15728640
5 393216,3145728
6 2621440,20971520
7 2490368,19922944
Necesito adquirir el segundo valor ( 11534336
,, 8388608
[...]) y multiplicarlo, por ejemplo, por 3, y guardar este valor en un archivo nuevo.
Respuesta1
awk
Tu también puedes usar
awk -F "," '{print $2*3}' src.dat > newfile
¿Dónde
src.dat
están sus datos de origen (entrada)?
newfile
El nuevo archivo (salida)
-F ","
se usa como separador de campo y ,
$2
se usa para tomar el segundo campo (lo que está después de ,
)
Respuesta2
Dado que es aritmética de enteros, probablemente podrías hacerlo directamente en el shell, por ejemplo enbash
while IFS="$IFS," read n x y; do printf '%d\n' "$((3*y))"; done < file > newfile
Prueba parastdout
$ while IFS="$IFS," read n x y; do printf '%d\n' "$((3*y))"; done < file
34603008
25165824
3460299
47185920
9437184
62914560
59768832
Respuesta3
Aquí está dc
y sed
haciendo el trabajo:
#v#backref courtesy Stephane's comment#v#
sed 's/.*,\(.*\)/[&,]P\1 *3p/' <<-\DATA | dc
1 1441792,11534336
2 1048576,8388608
3 1441792,1153433
4 1966080,15728640
5 393216,3145728
6 2621440,20971520
7 2490368,19922944
DATA
PRODUCCIÓN
1 1441792,11534336,34603008
2 1048576,8388608,25165824
3 1441792,1153433,3460299
4 1966080,15728640,47185920
5 393216,3145728,9437184
6 2621440,20971520,62914560
7 2490368,19922944,59768832
Esmuyrápido.
Puedes hacer lo mismo sin ninguna referencia retrospectiva, si hay alguna diferencia, de esta manera:
sed 's/^/[/;s/[^,]*$/&,]P& 3*p/' <file | dc
Si no los quieres todos juntos y quieres sólo los resultados, es aún más fácil:
sed 's/.*,//;s/$/ 3*p/' <file | dc
Y si quieres las líneas numeradas:
sed 's/.*,//;s/$/ 3*p/' <file | dc | nl