como selecionar, copiar colunas de arquivo diferente para formar novos arquivos

1

Eu tenho quatro arquivos, cada um contendo dados diários da estação.

  • arquivo 1: prec
  • arquivo 2: minT
  • arquivo 3: maxT
  • arquivo 4: vento

Aqui prec, minT, maxT e wind são arquivos que armazenam valores de prec, minT, maxT e wind para as estações 1 a n.

Eu quero armazenar os dados para cada estação como:

for station 1: prec minT maxT wind 
    station 2: prec minT maxT wind
    .
    .
    .
    .
    station n: prec minT maxT wind

EDIT # 1

Meus quatro dados se parecem com os seguintes:

Prec

1        2        3        4        5        6        7        8
0        0        0        0        0        0        0        0
0.254        0.254        0.254        0.254        0.254        0.254        0.254        0.254
0        0        0        0        0        0        0        0

Tmin

1          2          3          4          5          6          7          8
-23.349        -23.339        -23.327        -23.316        -23.303        -23.291        -23.278        -23.266
-23.682        -23.683        -23.685        -23.687        -23.689        -23.692        -23.695        -23.698
-24.302        -24.301        -24.3        -24.299        -24.299        -24.299        -24.3        -24.302

Tmax

 1         2         3         4         5         6         7         8
-17.087        -17.082        -17.077        -17.072        -17.066        -17.06        -17.053        -17.046
-20.082        -20.095        -20.109        -20.124        -20.14        -20.157        -20.174        -20.191
-20.48        -20.481        -20.483        -20.485        -20.486        -20.488        -20.489        -20.49

vento

1        2        3        4        5        6        7        8
0        0        0        0        0        0        0        0
1.778        1.778        1.778        1.778        1.778        1.778        1.778        1.778
1.652        1.653        1.654        1.654        1.655        1.656        1.657        1.658

Eu quero formatar o arquivo de dados para cada ponto com o qual ele é chamado (ou seja, para os pontos 1 a 8), conforme abaixo:

1

0        -23.349        -17.087        0
0.254        -23.682        -20.082        0
0        -24.302        -20.48        1.778

2

0        -23.339        -17.082        0
0.254      -23.683        -20.095        0
0        -24.301        -20.481        1.778

... e assim por diante ... para n .

Em que as colunas em cada arquivo seriam: nprec , nTmin , nTmax e nwind .

    
por AiB 22.08.2013 / 02:50

2 respostas

1

Acho que você poderia fazer isso com paste e possivelmente join .

paste file1 file2 > temp1
paste temp1 file3 > temp2
paste tmpe2 file4 > final

Isso deve funcionar se os arquivos contiverem os dados da estação 1 até a ordem. Caso contrário, você precisará alinhar os arquivos de alguma forma. Se a notação "stattion n" fizer parte de todos os arquivos, você deve classificá-los:

sort -o file1 file1
sort -o file2 file2
... and so forth

Em seguida, você pode fazer join em vez de paste como acima. join tem algumas opções complicadas sobre colocar linhas na saída que não combinam com o outro arquivo, então você pode ter que ler a página join man com muito cuidado e experimentar um pouco para conseguir o que deseja.

    
por 22.08.2013 / 03:12
0

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
    
por 22.08.2013 / 05:20