Faz um loop sobre um arquivo e lê valores de duas colunas em variáveis

5

Eu tenho um arquivo ( data.dat ) que contém 3 colunas. Eu quero ler em dois deles com o shell script e preencher o conteúdo em um arquivo de modelo. O arquivo é assim:

12 180 2390
14 177 2210
16 173 2130
...

Até agora, posso fazer isso com uma variável (que é a coluna 2 no arquivo de dados) da seguinte forma:

for a in 'cat data.dat | gawk '{print $2}''; do
 sed s/A/$a/ daily.template daily.template > daily.inp
done

Agora eu quero ler na coluna 3 também e dar o valor de acordo (b) da mesma linha que a coluna 2 para o mesmo modelo. O modelo contém variáveis chamadas "A" e "B". Eu não posso fazer um loop for aninhado como eu não quero iterar cada valor de um sobre cada valor de b.

Como posso conseguir isso?

Adição:

Primeiramente, obrigado por toda sua ajuda!

Sim, pode ser mais fácil de entender se eu der mais informações sobre o arquivo daily.template. Está parecendo semelhante a:

dens_column O3 300.00
dens_column h20 B
sza A
day_of_year 172
output sum
...

A e B devem ser substituídos em todos os ciclos das linhas. A primeira coluna em data.dat não significa nada, apenas exibe o tempo de uma medição e este parâmetro não é necessário em "daily.inp". Eu só quero um "daily.inp" para cada linha onde A e B são substituídos com o valor de acordo da coluna 2 e 3 na linha de acordo. Então, um arquivo daily.inp como:

dens_column O3 300.00
dens_column h20 2390
sza 180
day_of_year 172
output sum
...

Em seguida, o próximo arquivo é separado:

dens_column O3 300.00
dens_column h20 2210
sza 177
day_of_year 172
output sum
...

E assim por diante ...

    
por user46489 04.09.2013 / 16:16

3 respostas

8

Então, isso deve ser apenas uma questão de:

while read discard x y discard; do
  sed "s/A/$x/g;s/B/$y/g" < daily.template > "daily.$x-$y.inp"
done < data.dat

O comando read lerá uma linha por vez a partir de data.dat , colocará o primeiro campo (campos sendo separados em branco e onde a barra invertida pode ser usada para escapar do campo ou separador de linha) na variável $discard , o segundo em $x , o terceiro em $y e o restante dos campos em $discard .

    
por 04.09.2013 / 18:08
0

Você pode salvar as duas colunas em gawk printing $2 e $3 . Em seguida, extraia esses valores em variáveis separadas a1 e a2 usando col . A partir daí, é fácil para sed as duas variáveis de modelo.

    
por 04.09.2013 / 17:47
0

Você pode usar termsql para esse trabalho:

while read a b; do
   termsql -xwi daily.template "update tbl set COL2='$a' where COL1='h20'; update tbl set COL1='$b' where COL0='sza'" > daily$a$b.inp
done < <(termsql -wi data.dat "select COL1,COL2 from tbl")

Vantagem: se você conhece SQL, não precisa aprender uma nova sintaxe.

Você pode obter o termsql aqui: link

    
por 01.05.2014 / 18:08