Extraiga valores del nombre del archivo y agréguelos a un archivo de texto

Extraiga valores del nombre del archivo y agréguelos a un archivo de texto

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 forbucle aumentar en 1 en cada vuelta.

Intenté usar sedy 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 awkotra 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 pcomo separador y haría que la función sort -nsolo afectara a los siguientes números.

información relacionada