Tengo datos de un modelo cuadriculado (separados por diferente profundidad) guardados en archivos de texto. La estructura es así:
Formatode cada columna en una fila en el archivo de texto:
x_coordinate y_coordinate density
Hay alrededor de 400*400 puntos en cada archivo de texto (como un plano con cierta profundidad).
Nombre del archivo:
dep###
Aquí, ###
un número representa la profundidad (en la dirección Z). El número puede ser un número entero o una fracción. Por ejemplo, ahora tengo estos archivos: "dep0", "dep0.5", "dep10", "dep300", eso significa que esos datos son datos cuadriculados de 400*400 en forma de plano xy para una profundidad de 0, 0,5, 10 y 300.
Ahora, me gustaría tomar el número en el nombre del archivo (también conocido como profundidad) y agregarlo a la tercera columna de cada fila, combinarlos todos. Además, la profundidad debe ordenarse de mínimo a máximo. Entonces el archivo de salida debería verse así (por ejemplo):
x_coordinate y_coordinate z_coordinate density
0 0 0 2.5
0 1 0 2.5
... ... 0 2.6
400 400 0 2.9
0 0 0.5 2.8
... ... 0.5 2.9
0 0 10 3.2
... ... 10 3.3
... ... 300 4.7
... ... 300 4.8
Al principio lo hacía con este script:
for((i=$depmin;i<=$depmax;i++))
do
if [ -f "xyp/dep"$i ];then
awk '{print $1, $2,'$i',$3}' "xyp/dep"$i >> "xyzp/area1"
fi
done
Luego me doy cuenta de que se perderían todos los archivos cuya profundidad no sea entera, ya que elvariable $yoen el for
bucle aumentar en 1 en cada vuelta.
Intenté usar sed
y find -exec
, pero seguí recibiendo errores. La dificultad para mí es que no entiendo muy bien cómo usar $
correctamente ''
para <<<
redirigir o canalizar el valor a awk
otra función. Por favor ayúdame con este problema.
======================
Se me ocurrió este script:
depnumbers=$(ls xyp | sed -e 's/dep//g' |sort -n)
filecount=$(ls xyp | wc -l)
for((i=1;i<=$filecount;i++))
do
dep=$(awk '{print $'$i'}' <<< $depnumbers)
awk '{print $1, $2,'$dep',$3}' "xyp/dep"$dep >> "xyzp/area1"
done
Funciona muy bien. ¿Hay alguna forma de simplificar o mejorar este script para dicha tarea? En realidad soy nuevo en Bash y sigo pensando que algo anda mal... no estoy seguro
Respuesta1
Solo para agregar números al archivo.
awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' xyp/dep* > "xyzp/area1"
Para ordenar por números.
ls -1v xyp/dep* | xargs awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' > "xyzp/area1"
Para ordenar desde números negativos.
ls xyp/dep* | sort -t 'p' -k 3 -n | xargs awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' > "xyzp/area1"
Esto consideraría el carácter p
como separador y haría que la función sort -n
solo afectara a los siguientes números.