Linux/Unix Shell Scripting - Dudas en modificación de columnas AWK

 
Vista:

Dudas en modificación de columnas AWK

Publicado por Lucas Lodeiro (3 intervenciones) el 23/03/2018 17:37:15
Hola! Tengo un archivo capa2da.dat de varias filas (muchas) del tipo:

H 2.123456789 3.12456789 4.123456789 0 0 0

Necesito incluir en un script un comando que me altere la 4° columna restando una variable definida ya previamente en el shell, y las otras queden sin alterarse. Primero probe en modificar la 4° columna solamente con;

awk -v CTECRYSTAL="${CTECRYSTAL}" '{printf "%12.9f\n",$4-CTECRYSTAL}' capa2da.dat > capa2daZ.dat

Logre asi que hiciera la resta correctamente, pero solo obtengo la 4° columna, intente añadiendo las demas columnas sin alterar, asi:

awk -v CTECRYSTAL="${CTECRYSTAL}" '{printf "%12.9f\n",$1,$2,$3,$4-CTECRYSTAL,$5,$6,$7}' capa2da.dat > capa2daZ.dat

Pero me da error porque la primera columna no tiene la cantidad de caracteres suficientes, pero requiero que la columna 2 3 y 4 tengan dicha cantidad de caracteres. Tambien probe con:

awk -v CTECRYSTAL="${CTECRYSTAL}" '{print "\n",$1,$2,$3}{printf "%12.9f\n",$4-CTECRYSTAL}{print "\n",$5,$6,$7}' capa2da.dat > capa2daZ.dat

Con esto imprime todo lo que requiero, pero no respeta las filas... cada fila del input se transforma en 3 filas:

H 2.123456789 3.12456789
4.123456789 (alterada por la resta)
0 0 0

¿Alguien sabe como puedo arreglar eso en AWK, o con otros comandos de bash?

Saludos y gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Dudas en modificación de columnas AWK

Publicado por Lucas Lodeiro (3 intervenciones) el 23/03/2018 20:21:02
Lo solucione de esta forma:

1
2
3
4
5
awk -v CTECRYSTAL="${CTECRYSTAL}" '{printf "%12.9f\n",$4-CTECRYSTAL}' capa2da.dat > capa2daZ.dat
 
paste <(awk '{print $1,$2,$3}' capa2da.dat ) <(awk '{print $1}' capa2daZ.dat ) <(awk '{print $5,$6,$7}' capa2da.dat) > capa2dafinal.dat
 
rm capa2da.dat capa2daZ.dat

Asi asigne todo a un archivo nuevo final... no es muy pulcro como se logra, de hecho no que da guardado con el mismo espaciado, pero es efectivo.
Si alguien tiene un metodo mas simple y efectivo se lo agradeceria.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Dudas en modificación de columnas AWK

Publicado por Tom (361 intervenciones) el 23/03/2018 21:30:36
¿¿ Por que no haces algo como:
printf("%s %s %s %12.9f %s %s %s\n", $1, $2, $3, $4 - CTE, $5, $6, $7)
??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dudas en modificación de columnas AWK

Publicado por Lucas Lodeiro (3 intervenciones) el 23/03/2018 23:26:10
Porque da este error:

awk: línea ord.:1: (FILENAME=capa2da.dat FNR=1) fatal: no hay suficientes argumentos para satisfacer a la cadena de formato
`%s %s %s %12.9f %s %s %s
'
se acabó ^ para éste
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dudas en modificación de columnas AWK

Publicado por Tom (361 intervenciones) el 24/03/2018 09:13:37
Tienes que pasarle a printf tantos valores como '%' haya en el formato ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dudas en modificación de columnas AWK

Publicado por Tom (361 intervenciones) el 24/03/2018 09:35:24
Esto funciona perfectamente:

1
2
3
4
5
CTE=2.0
awk -v CTE=$CTE '{printf "%s %s %s %12.9f %s %s %s\n", $1, $2, $3, $4 - CTE, $5, $6, $7}' <<-!
H 2.123456789 3.12456789 4.123456789 0 0 0
H 2.123456789 3.12456789 9.123456789 0 0 0
!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar