【问题标题】:Multiplying all values in a txt file with another value将txt文件中的所有值与另一个值相乘
【发布时间】:2019-07-06 13:54:39
【问题描述】:

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

【问题讨论】:

  • 请注意,975.78 更接近 975.8,您可能希望将数字四舍五入而不是截断。
  • 四舍五入你想做什么?向上或向下舍入或不偏不倚或截断或其他什么,或者你真的不在乎吗?
  • 1000 是否已修复(添加一些0 后使其成为移动点的字符串操作)?
  • 如果此处的答案之一解决了您的问题,请接受该答案。接受答案会关闭此问题并奖励接受答案的作者。如果您的问题没有得到解决,请考虑解释原因。

标签: bash awk sed find


【解决方案1】:

如果你有直流电:

cat infile | dc -f - -e '1k1000sa[la*Sdz0!=Z]sZzsclZx[Ld1/psblcd1-sc1<Y]sYlYx'

【讨论】:

  • 投票给我 5 年来在 Stack Overflow 上看到的最疯狂的答案!
  • 在这种特殊情况下无法击败手动计算!
【解决方案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) ) ' 

【讨论】:

  • 完美简洁。效果很好。我将如何获得一位小数或根本没有?
  • 一位小数perl -lpe ' $_=sprintf("%0.1f",$_*1000 ) '
  • 没有小数点 perl -lpe ' $_=sprintf("%0.0f",$_*1000 ) ' andy.txt.. 注意它是四舍五入
  • perl -lpe ' $_=sprintf("%0.0f",int($_*1000) ) ' 用于截断.. 将它们全部添加到答案中
【解决方案3】:

awk 来救援!

$ awk '{printf "%.1f\n", $1*1000}' file > tmp && mv tmp file

【讨论】:

    【解决方案4】:

    使用num-utils。对于 8 位小数的答案:

    numprocess '/*1000/' n.txt
    

    对于小数点后 1 位的四舍五入答案:

    numprocess '/*1000/' n.txt | numround -n '.1'
    

    【讨论】:

      【解决方案5】:

      使用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
      

      使用这些命令直接覆盖文件是不可能的。您必须写入一个临时文件(附加&gt; tmp &amp;&amp; mv tmp yourFile)或使用moreutils 包中的sponge 命令(附加| 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 这样的东西)。

      【讨论】:

      • 以前用过sed,这个工作正常,除了它不会破坏性地覆盖文件。虽然我想要一些文件,但目前的需要只是为了解决这些数字。这一款做得很完美。有没有办法摆脱所有的小数和“。” (点)也是?
      • 重新“覆盖...不可能”:使用GNU sede评估命令它可以像sed -i 's/.*/'"dc -e '1000 &amp; * p'"'/e' yourFile一样完成。它的效率更低(为每一行使用dc 的单独实例),但不需要sponge
      • @agc 很高兴知道。但是 OP 使用的是 GNU sed 不附带的 mac os。
      • @Socowi,没错,但如果有必要,可以使用gsed。见How to use GNU sed on Mac OS X
      猜你喜欢
      • 1970-01-01
      • 2021-06-12
      • 2016-06-05
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多