A partir da sua descrição, parece que você gostaria de fazer uma iteração nos 4 arquivos, Prec, Tmin, Tmax e wind, e pegar os dados da coluna de cada um e mesclá-los em um arquivo único para cada coluna.
A abordagem
Uma maneira de conseguir isso é usando um loop Bash for
, paste
e awk
. A abordagem seria algo assim:
for i in 'seq 8'; do
... do stuff ...
done
O objetivo principal desse loop seria percorrer as colunas de 1 a 8.
Puxando colunas
A próxima parte que precisamos reunir é a capacidade de extrair dados de um arquivo, em termos de coluna. Uma ideia seria usar awk
para fazer isso.
$ awk '{print $1}' Prec
1
0
0.254
0
Podemos levar isso um passo adiante e fazê-lo pular a primeira linha, que é o número de referência da coluna, assim:
$ awk 'NR>1{print $1}' Prec
0
0.254
0
Podemos ir ainda mais longe, parametrizando a coluna que estamos imprimindo, tornando-a uma variável que passamos para awk
da seguinte forma:
$ awk -v a=1 'NR>1{print $a}' wind
0
1.778
1.652
$ awk -v a=2 'NR>1{print $a}' wind
0
1.778
1.653
Pulando colunas de vários arquivos
Este bit é provavelmente o bit menos elegante para esta solução, mas eu sou um awk
noob, então quando em dúvida, vá com um hack.
Aqui estavam usando a saída de vários awk
, que puxam os dados em coluna de cada arquivo e os colam juntos usando paste
.
Aqui estão 2 dos arquivos, apenas para facilitar a visualização.
coluna # 1
$ paste <(awk -v a=1 'NR>1 {print $a}' Prec) <(awk -v a=1 'NR>1 {print $a}' Tmin)
0 -23.349
0.254 -23.682
0 -24.302
coluna # 2
$ paste <(awk -v a=2 'NR>1 {print $a}' Prec) <(awk -v a=2 'NR>1 {print $a}' Tmin)
0 -23.339
0.254 -23.683
0 -24.301
Para obter colunas de todos os quatro arquivos, vamos simplesmente expandir essa abordagem.
defina nosso índice ( $i
) como 1.
$ i=1
$ paste <(awk -v a=$i 'NR>1 {print $a}' Prec) <(awk -v a=$i 'NR>1 {print $a}' Tmin) <(awk -v a=$i 'NR>1{print $a}' Tmax) <(awk -v a=$i 'NR>1 {print $a}' wind)
0 -23.349 -17.087 0
0.254 -23.682 -20.082 1.778
0 -24.302 -20.48 1.652
defina nosso índice ( $i
) como 2.
$ i=2
$ paste <(awk -v a=$i 'NR>1 {print $a}' Prec) <(awk -v a=$i 'NR>1 {print $a}' Tmin) <(awk -v a=$i 'NR>1{print $a}' Tmax) <(awk -v a=$i 'NR>1 {print $a}' wind)
0 -23.339 -17.082 0
0.254 -23.683 -20.095 1.778
0 -24.301 -20.481 1.653
Colocando tudo junto
Então, vamos incorporar o paste <(awk ..) <(awk ..) <(awk ..) <(awk ..)
no loop for
.
$ for i in 'seq 8'; do
echo "## $i ##"
paste <(awk -v a=$i 'NR>1 {print $a}' Prec) <(awk -v a=$i 'NR>1 {print $a}' Tmin) <(awk -v a=$i 'NR>1{print $a}' Tmax) <(awk -v a=$i 'NR>1 {print $a}' wind)
done
## 1 ##
0 -23.349 -17.087 0
0.254 -23.682 -20.082 1.778
0 -24.302 -20.48 1.652
## 2 ##
0 -23.339 -17.082 0
0.254 -23.683 -20.095 1.778
0 -24.301 -20.481 1.653
## 3 ##
0 -23.327 -17.077 0
0.254 -23.685 -20.109 1.778
0 -24.3 -20.483 1.654
...
Eu adicionei um echo
acima para que, no resultado, seja mais fácil ver qual coluna está sendo impressa.
Escrevendo tudo nos arquivos
Ao adicionar esse bit após o comando paste ...
, podemos gravar os resultados nos arquivos individuais conforme você especificou.
paste ... | tee out$i.txt
A coisa toda como um forro único:
$ for i in 'seq 8';do echo "## $i ##"; paste <(awk -v a=$i 'NR>1 {print $a}' Prec) <(awk -v a=$i 'NR>1 {print $a}' Tmin) <(awk -v a=$i 'NR>1{print $a}' Tmax) <(awk -v a=$i 'NR>1 {print $a}' wind) | tee out$i.txt;done
Que resulta na gravação desses arquivos:
$ ll
total 48
-rw-rw-r-- 1 saml saml 71 Aug 21 23:17 out1.txt
-rw-rw-r-- 1 saml saml 72 Aug 21 23:17 out2.txt
-rw-rw-r-- 1 saml saml 70 Aug 21 23:17 out3.txt
-rw-rw-r-- 1 saml saml 72 Aug 21 23:17 out4.txt
-rw-rw-r-- 1 saml saml 71 Aug 21 23:17 out5.txt
-rw-rw-r-- 1 saml saml 71 Aug 21 23:17 out6.txt
-rw-rw-r-- 1 saml saml 70 Aug 21 23:17 out7.txt
-rw-rw-r-- 1 saml saml 71 Aug 21 23:17 out8.txt