Eu tenho um modelo de dados em grade (separados por profundidade diferente) salvo em arquivos de texto. A estrutura é assim:
Formato de 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 determinada 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 fração. Por exemplo, agora eu tenho esses arquivos: "dep0", "dep0.5", "dep10", "dep300", que significa que os dados são 400 * 400 dados em grade na forma de plano xy para profundidade de 0, 0,5, 10 e 300.
Agora, eu gostaria de pegar o número no nome do arquivo (também conhecido como a profundidade) e adicioná-lo à terceira coluna de cada linha, combinar todos eles juntos. Além disso, a profundidade deve ser classificada de mínima a máxima. Então o arquivo de saída deve se parecer com isso (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 perderia qualquer arquivo cuja profundidade não é inteira, já que a variável $ i no loop for
aumenta em 1 em cada rodada.
Eu tentei usar sed
e find -exec
, mas continuei recebendo erros. A dificuldade para mim é que eu não entendo muito bem como usar $
, ''
, <<<
corretamente para redirecionar ou canalizar o valor para awk
ou outra função. Por favor me ajude com esse 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 eu sou novo para bater e ainda acho que algo está errado ... não tenho certeza