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 for
loop, aumente 1 em cada rodada.
Tentei usar sed
e 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 awk
ou 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 p
como separador e faria com que a função sort -n
afetasse apenas os números seguintes.