我的目的是将文本文件中的所有值乘以一个数字。在我的情况下是1000。
文件中的原始文本:
0.00493293814
0.0438981727
0.149746656
0.443125129
0.882018387
0.975789607
0.995755374
1
我希望输出看起来像: (因此,将文件的内容更改为...)
4.93293814
43.8981727
149.746656
443.125129
882.018387
975.789607
995.755374
1000
甚至:
4.9
43.8
149.7
443.1
882.0
975.7
995.7
1000
我在终端的macOS上使用bash。
答案 0 :(得分:2)
如果您有dc:
cat infile | dc -f - -e '1k1000sa[la*Sdz0!=Z]sZzsclZx[Ld1/psblcd1-sc1<Y]sYlYx'
答案 1 :(得分:2)
使用Perl
perl -lpe ' $_=$_*1000 '
具有输入和内联替换
$ cat andy.txt
0.00493293814
0.0438981727
0.149746656
0.443125129
0.882018387
0.975789607
0.995755374
1
$ perl -i -lpe ' $_=$_*1000 ' andy.txt
$ cat andy.txt
4.93293814
43.8981727
149.746656
443.125129
882.018387
975.789607
995.755374
1000
$
一位小数位
perl -lpe ' $_=sprintf("%0.1f",$_*1000 ) '
零位小数并四舍五入
perl -lpe ' $_=sprintf("%0.0f",$_*1000 ) '
零位小数和截断
perl -lpe ' $_=sprintf("%0.0f",int($_*1000) ) '
答案 2 :(得分:1)
awk
来营救!
$ awk '{printf "%.1f\n", $1*1000}' file > tmp && mv tmp file
答案 3 :(得分:1)
使用num-utils。对于小数点后8位的答案:
numprocess '/*1000/' n.txt
对于四舍五入到小数点后一位的答案:
numprocess '/*1000/' n.txt | numround -n '.1'
答案 4 :(得分:0)
使用sed
在每行前面加上1000*
,然后使用bc
处理所得的数学表达式。要仅显示小数点后的第一位数字,可以再次使用sed
。
sed 's/^/1000*/' yourFile | bc | sed -E 's/(.*\..).*/\1/'
这将打印您的预期输出中的后者。就像您想要的那样,小数位会被剪切而不是四舍五入({1.36
被转换为1.3
)。
要删除所有十进制数字,请用… | sed …
替换最后一个sed -E 's/\..*//'
或使用以下命令
sed 's:^.*$:1000*&/1:' yourFile | bc
使用这些命令无法直接覆盖文件。您必须写一个临时文件(附加> tmp && mv tmp yourFile
)或使用软件包sponge
中的moreutils
命令(附加| sponge yourFile
)。
但是,如果要在乘法之后删除所有小数点,则有一个技巧。不用实际乘以1000,我们可以在语法上移动小数点。这可以通过一个sed
命令来完成。 sed
具有-i
选项来覆盖输入文件。
sed -i.bak -E 's/\..*/&000/;s/^[^.]*$/&.000/;s/\.(...).*/\1/;s/^(-?)0*(.)/\1\2/' yourFile
该命令将yourFile
的内容更改为
4
43
149
443
882
975
995
1000
已创建原始文件的备份yourFile.bak
。
单个sed
命令也应该适用于每种输入数字格式(即使对于-.1
→-100
之类的东西也是如此)。