Extraia valores do nome do arquivo e adicione-os em um arquivo de texto

Extraia valores do nome do arquivo e adicione-os em um arquivo de texto

Eu tenho dados de modelo em grade (separados por diferentes profundidades) salvos em arquivos de texto. A estrutura é assim:

Formatarde cada coluna em uma linha no arquivo de texto:

x_coordinate y_coordinate density

Existem cerca de 400*400 pontos em cada arquivo de texto (como um plano em certa profundidade).

Nome do arquivo:

dep###

Aqui, ###um número representa a profundidade (na direção Z). O número pode ser um número inteiro ou uma fração. Por exemplo, agora tenho estes arquivos: "dep0", "dep0.5", "dep10", "dep300", o que significa que esses dados são dados gradeados de 400 * 400 no formato do plano xy para profundidade de 0, 0,5, 10 e 300.

Agora, gostaria de pegar o número no nome do arquivo (também conhecido como profundidade) e adicioná-lo à terceira coluna de cada linha, combinando todos eles. Além disso, a profundidade deve ser classificada do mínimo ao máximo. Portanto, o arquivo de saída deve ficar assim (por exemplo):

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

No começo eu estava fazendo isso com 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

Então eu descobri que faltaria qualquer arquivo cuja profundidade não fosse inteira, já que ovariável $ino forloop, aumente 1 em cada rodada.

Tentei usar sede find -exec, mas continuei recebendo erros. A dificuldade para mim é que não entendo muito bem como usar $, '', <<<corretamente para redirecionar ou canalizar o valor para awkou outra função. Por favor ajude-me com este problema.

=====================

Eu criei 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 muito bem. Existe alguma maneira de simplificar ou melhorar este script para tal tarefa? Na verdade, sou novo no bash e ainda acho que algo está errado... não tenho certeza

Responder1

Apenas para adicionar números ao arquivo.

awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' xyp/dep* > "xyzp/area1"

Para classificar por números.

ls -1v xyp/dep* | xargs awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' > "xyzp/area1"

Para classificar a partir de 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"

Isso consideraria o caractere pcomo separador e faria com que a função sort -nafetasse apenas os números seguintes.

informação relacionada