multiplicação de cada linha

1

Eu gostaria de calcular um valor em cada linha de um arquivo como este:

1  1441792,11534336
2  1048576,8388608
3  1441792,1153433
4  1966080,15728640
5  393216,3145728
6  2621440,20971520
7  2490368,19922944

Eu preciso adquirir o segundo valor ( 11534336 , 8388608 , [...]) e multiplicar, por exemplo, por 3, e salvar este valor em um novo arquivo.

    
por soumen 19.06.2014 / 22:53

3 respostas

2

Como é aritmética inteira, você provavelmente poderia fazer isso diretamente no shell - por exemplo, em bash

while IFS="$IFS," read n x y; do printf '%d\n' "$((3*y))"; done < file > newfile

Teste para stdout

$ while IFS="$IFS," read n x y; do printf '%d\n' "$((3*y))"; done < file
34603008
25165824
3460299
47185920
9437184
62914560
59768832
    
por 19.06.2014 / 23:18
2

Você pode usar awk também

 awk -F "," '{print $2*3}' src.dat  > newfile

em que src.dat é seus dados de origem (entrada)
newfile o novo arquivo um (saída)
-F "," use como separador de campo , e $2 é usado para pegar o segundo campo (o que é depois do , )

    
por 19.06.2014 / 23:35
2

Aqui estão dc e sed fazendo o trabalho:

#v#backref courtesy Stephane's comment#v#
sed 's/.*,\(.*\)/[&,]P *3p/' <<-\DATA | dc
    1  1441792,11534336
    2  1048576,8388608
    3  1441792,1153433
    4  1966080,15728640
    5  393216,3145728
    6  2621440,20971520
    7  2490368,19922944
DATA

OUTPUT

1  1441792,11534336,34603008
2  1048576,8388608,25165824
3  1441792,1153433,3460299
4  1966080,15728640,47185920
5  393216,3145728,9437184
6  2621440,20971520,62914560
7  2490368,19922944,59768832

É muito rápido.

Você pode fazer o mesmo sem backreferences - se fizer alguma diferença - desta maneira:

 sed 's/^/[/;s/[^,]*$/&,]P& 3*p/' <file | dc

Se você não quer todos juntos e quer apenas os resultados, ainda é mais fácil:

sed 's/.*,//;s/$/ 3*p/' <file | dc

E se você quiser as linhas numeradas:

sed 's/.*,//;s/$/ 3*p/' <file | dc | nl
    
por 19.06.2014 / 23:10

Tags