我想计算文件每一行的值,如下所示:
1 1441792,11534336
2 1048576,8388608
3 1441792,1153433
4 1966080,15728640
5 393216,3145728
6 2621440,20971520
7 2490368,19922944
我需要获取第二个值 ( 11534336
, 8388608
, [...]) 并乘以例如 3,并将该值保存到新文件中。
答案1
awk
你也可以使用
awk -F "," '{print $2*3}' src.dat > newfile
src.dat
您的源数据(输入)在哪里
newfile
新文件一(输出)
-F ","
用作字段分隔符,
$2
用于获取第二个字段(后面是什么,
)
答案2
由于它是整数算术,您可以直接在 shell 中执行 - 例如bash
while IFS="$IFS," read n x y; do printf '%d\n' "$((3*y))"; done < file > newfile
测试以stdout
$ while IFS="$IFS," read n x y; do printf '%d\n' "$((3*y))"; done < file
34603008
25165824
3460299
47185920
9437184
62914560
59768832
答案3
这是dc
并sed
正在做的工作:
#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
输出
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
它是非常快速地。
您可以在没有任何反向引用的情况下执行相同的操作(如果有任何区别),方法如下:
sed 's/^/[/;s/[^,]*$/&,]P& 3*p/' <file | dc
如果您不想将它们全部放在一起而只想要结果,那就更容易了:
sed 's/.*,//;s/$/ 3*p/' <file | dc
如果你想要对行进行编号:
sed 's/.*,//;s/$/ 3*p/' <file | dc | nl