将txt文件中的所有值与另一个值相乘

时间:2019-02-12 20:26:12

标签: bash awk sed find

我的目的是将文本文件中的所有值乘以一个数字。在我的情况下是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。

5 个答案:

答案 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之类的东西也是如此)。