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
Preciso adquirir o segundo valor ( 11534336
, 8388608
, [...]) e multiplicar por, por exemplo, 3, e salvar esse valor em um novo arquivo.
Responder1
awk
Você também pode usar
awk -F "," '{print $2*3}' src.dat > newfile
onde
src.dat
estão seus dados de origem (entrada)
newfile
o novo arquivo (saída)
-F ","
usado como separador de campo ,
$2
é usado para pegar o segundo campo (o que está depois do ,
)
Responder2
Como é aritmética de números inteiros, você provavelmente poderia fazer isso diretamente no shell - por exemplo, embash
while IFS="$IFS," read n x y; do printf '%d\n' "$((3*y))"; done < file > newfile
Testando parastdout
$ while IFS="$IFS," read n x y; do printf '%d\n' "$((3*y))"; done < file
34603008
25165824
3460299
47185920
9437184
62914560
59768832
Responder3
Aqui está dc
e sed
fazendo o trabalho:
#v#backref courtesy Stephane's comment#v#
sed 's/.*,\(.*\)/[&,]P\1 *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
SAÍDA
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
Isso émuitorápido.
Você pode fazer o mesmo sem referências anteriores - se isso fizer alguma diferença - desta forma:
sed 's/^/[/;s/[^,]*$/&,]P& 3*p/' <file | dc
Se você não quer todos juntos e quer apenas os resultados é mais fácil ainda:
sed 's/.*,//;s/$/ 3*p/' <file | dc
E se você quiser as linhas numeradas:
sed 's/.*,//;s/$/ 3*p/' <file | dc | nl