Como multiplicar um arquivo de dados com outro arquivo de dados de índice?

2

Quero sua ajuda para multiplicar meu arquivo de dados com outro arquivo de dados de índice. Ambos os arquivos de dados têm o mesmo número de linhas. Mas o arquivo de dados tem mais de 1000 colunas, enquanto os dados de índice têm apenas uma coluna. O arquivo de índice é o fator pelo qual eu quero multiplicar as colunas inteiras dos meus dados. Aqui estão os meus dados de amostra e o resultado necessário abaixo

Data.txt:

10  20  30  40  50
20  30  40  50  60
30  40  50  60  70
40  50  60  70  80
50  60  70  80  90
60  70  80  90  100
70  80  90  100 110
80  90  100 110 120

index.txt:

0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
.
.
.
.

O arquivo de saída necessário será

out.txt

1   2   3   4   5
4   6   8   10  12
9   12  15  18  21
16  20  24  28  32
25  30  35  40  45
36  42  48  54  60
49  56  63  70  77
64  72  80  88  96
    
por AiB 10.03.2014 / 06:03

4 respostas

4

Tente isto:

awk 'FNR==NR{a[FNR]=$0;next}
    {for(i=1;i<=NF;i++){printf("%d\t",$i*a[FNR])}printf("\n")}' index.txt data.txt

Para index.txt , salvamos o valor de cada linha no array associativo. Então, quando processamos data.txt , multiplicamos o valor de cada campo pelo valor correspondente na matriz associativa, que é a[FNR] .

Ele funciona da mesma forma que a resposta do @ devnull, mas não precisamos codificar o nome do arquivo em nosso programa.

    
por 10.03.2014 / 06:36
3

Você pode usar awk . Leia a linha correspondente em index.txt enquanto lê data.txt e multiplique cada campo pelo valor obtido do primeiro:

awk '{getline f < "index.txt"; for(i=1;i<=NF;i++) {printf("%d\t",$i*f)} printf("\n")}' data.txt

Para sua entrada, produziria:

1       2       3       4       5
4       6       8       10      12
9       12      15      18      21
16      20      24      28      32
25      30      35      40      45
36      42      48      54      60
49      56      62      70      77
64      72      80      88      96
    
por 10.03.2014 / 06:25
3

Aqui está uma maneira:

$ paste index.txt data.txt | 
    awk '{for(i=2;i<=NF;i++){printf "%d\t", $1*$(i)}; print "";}' 
1   2   3   4   5   
4   6   8   10  12  
9   12  15  18  21  
16  20  24  28  32  
25  30  35  40  45  
36  42  48  54  60  
49  56  62  70  77  
64  72  80  88  96  

paste unirá as linhas correspondentes do arquivo, de modo que o índice será $1 no script awk , que simplesmente passa por cada campo e o multiplica pelo valor atual do índice.

Uma abordagem semelhante, se um pouco mais idiomática, em Perl:

$ paste index.txt data.txt | perl -lane 'print join "\t",map{$_*$F[0]}@F[1..$#F]'
    
por 10.03.2014 / 06:38
2

Perl simples:

#!/usr/bin/perl

open(INDEX,"$ARGV[0]") or die "$@:$!";
open(DATA,"$ARGV[1]") or die "$@:$!";

while (($dline=<DATA>) and ($i=<INDEX>)) {
  chomp($dline, $i);
  for $n (split /\s+/, $dline) {
    printf "%-4d ", $n * $i;
  }
  print "\n";
}

.

$ perl mult.pl index.txt data.txt
1    2    3    4    5    
4    6    8    10   12   
9    12   15   18   21   
16   20   24   28   32   
25   30   35   40   45   
36   42   48   54   60   
49   56   62   70   77   
64   72   80   88   96   
    
por 10.03.2014 / 06:53

Tags