Extrai valores do nome do arquivo e adiciona em um arquivo de texto

1

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

    
por Pakox.Wang 15.10.2014 / 11:04

1 resposta

0

Para adicionar apenas 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 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 a seguir.

    
por 15.10.2014 / 15:12