Estoy tratando de manipular un archivo que contiene números en notación científica, pero sin el e
símbolo, 1.2e+3
es decir, está escrito como 1.2+3
.
Lo más fácil que pensé hacer awk
fue reemplazar +
con e+
, usar la gsub
función y hacer mi cálculo en el nuevo archivo. Lo mismo ocurre con el caso negativo. Entonces, se podría hacer una solución simple usando el siguiente comando
awk '{gsub("+", "e+", $1); print $1, $2, $3, $4, $5}' file_in
y hacer lo mismo en todas las columnas.
Sin embargo, el archivo también contiene números negativos, lo que hace las cosas un poco más complicadas. A continuación se puede ver un archivo de muestra
1.056000+0 5.000000-1 2.454400-3 2.914800-2 8.141500-6
2.043430+1 5.000000-1 2.750500-3 2.698100-2-2.034300-4
3.829842+1 5.000000-1 1.969923-2 2.211364-2 9.499900-6
4.168521+1 5.000000-1 1.601262-2 3.030919-2-3.372000-6
6.661784+1 5.000000-1 5.250575-2 3.443669-2 2.585500-5
7.278104+1 5.000000-1 2.137055-2 2.601701-2 8.999800-5
9.077287+1 5.000000-1 1.320498-2 2.961020-2-1.011600-5
9.248130+1 5.000000-1 3.069610-3 2.786329-2-6.317000-5
1.049935+2 5.000000-1 4.218794-2 3.321955-2-5.097000-6
1.216283+2 5.000000-1 1.432105-2 3.077165-2 4.300300-5
¿Alguna idea sobre cómo manipular y calcular con un archivo así?
text-processing
awk
Thanos
fuente
fuente
Respuestas:
¿Es correcta esta salida?
Código:
Explicación:
-lne
cuidar las terminaciones de línea, procesar cada línea de entrada, ejecutar el código que sigues/(\.\d+)(\+|\-)/\1e\2/g
:s
)(.\d+)(\+|\-)
encontrar dos grupos de (un punto y números) y (un más o menos)\1e\2
sustituirlos con el primer grupo ye
luego con el segundo grupog
globalmente: no se detenga en la primera sustitución en cada línea, sino que procese todos los golpes posiblesprint
imprime la líneasample
fichero de entradaEste agrega espacio si falta. De hecho, pone espacio entre los números independientemente. Es decir. si hubiera dos espacios en algún caso, solo habría uno en la salida.
La mayor parte es similar a la anterior. Lo nuevo es el
(\d+)
grupo nr 3 y el(\s*)
grupo nr 4.*
aquí significa opcional. En la sustitución no\4
se utiliza. Hay un espacio en su lugar.La salida es esta:
fuente
.
en el primer grupo. Esto es correcto. Sin esta barra invertida, el punto no significaría un punto literal.También podría usar
sed
, por ejemplo:Sin embargo, esto no tiene en cuenta que las columnas en la lista de OP a veces no están separadas. Aquí hay una solución alternativa con la precisión adecuada:
Salida:
fuente
2.698100-2-2.034300-4
OFMT
variable para establecer la precisión de awk a la misma que la entrada