将值从道尔顿转换为千道尔顿(将值除以 1000)

将值从道尔顿转换为千道尔顿(将值除以 1000)

如何使用 shell 命令将道尔顿值转换为千道尔顿?我有一个值列表道尔顿1千道尔顿等于1000道尔顿,因此需要将每个值除以一千。

样本数据:

12345.09
236575.665
18865.41
45678.87

期望输出:

12.34509
236.575665
18.86541
45.67887

答案1

awk

这里的任务只是将每个值除以一千。有几种很好的方法可以做到这一点——全部文件中的值——只需一个命令。假设您的数字位于一个名为的文件中dalton.txt,并且如您显示的示例所示,每行一个值。以下是使用 AWK 的一种方法:

awk '{ print $0 / 1000.0 }' dalton.txt

对每一行进行操作。$0在 AWK 中表示整行。正如所写,输出到您的终端,但您可以重定向输出到文件。这会将输出发送到kilodalton.txt(如果已存在则覆盖):

awk '{ print $0 / 1000.0 }' dalton.txt > kilodalton.txt

但是,您可能想要自定义精度。鉴于您向我们展示的示例输入,使用这些命令到您的终端或文件的输出是:

12.3451
236.576
18.8654
45.6789

在您的输出示例中,每个输出值都保留与相应输入值相同的精度(就显示的信息位数而言)。如果您想要:

awk '{ printf "%.*g\n", length($0), $0 / 1000.0 }' dalton.txt

这仍然会截断小数点后的尾随零,因为这就是函数printfg 格式说明符行为。(您的示例没有清楚地表明您是否想要这样做。)它的工作方式只是指定一个精度,该精度始终至少与输入中的数字位数一样高,但使其成为输入行的总长度length($0)

该命令当然也可以重定向到文件,其输出正是您的问题中显示的输出:

12.34509
236.575665
18.86541
45.67887

通常,您可能希望为每个条目指定相同的精度,要么是显示的数字总数,要么是小数点后显示的数字数量。例如,要为每个值显示总共 6 位数字(第一行将是12.3451),请使用:

awk '{ printf "%.6g\n", $0 / 1000.0 }' dalton.txt

或者显示 3 个数字每个值的小数位(第一行将是12.345)使用:

awk '{ printf "%.3f\n", $0 / 1000.0 }' dalton.txt

虽然可以在 shell 脚本中编写一个循环来读取数据,但这样做比较复杂,而且当一个简单的命令就能为你完成时,这很少是最好的方法。即使这已经是较大的 shell 脚本的一部分,shell 也是粘合语言这些工具用于调用最适合某项任务的工具。因此我建议使用这种awk方法,terdon 的优秀perl方法或诸如此类。

答案2

我只会使用perl

$ perl -lne 'print $_/1000' file
12.34509
236.575665
18.86541
45.67887

或者awk

$ awk '{printf "%.6f\n", $1/1000}' file
12.345090
236.575665
18.865410
45.678870

答案3

一般描述

假设数值存储在变量中dalton。然后它使用足够大的值来通过简单构造创建非零值$(())

例子:

$ dalton=3800
$ echo $(($dalton/1000))
3

为了正确地舍入到最接近的整数

$ echo $(( ($dalton+500)/1000 ))
4

如果您安装,您将拥有更多功能bc

sudo apt-get install bc

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
scale=3                        # set the number of decimals
dalton=3800
dalton/1000
3.800
(dalton+0,5)/1000
(standard_in) 4: syntax error  # use decimal point (not comma)
(dalton+0.5)/1000              # add 0.5 to get correct rounding
3.800
dalton=3800.8
(dalton+0.5)/1000
3.801
dalton=3800.2
(dalton+0.5)/1000
3.800
quit
$ 

在 shellscript 中,你可以像这样将输入导入 bc,

echo "scale=3
($dalton+0.5)/1000" | bc

也可以进行交互式测试,

$ dalton=3800.8
$ echo "scale=3
($dalton+0.5)/1000" | bc
3.801
$

Shell脚本

创建一个名为converter

#!/bin/bash

dalton=

function convert2kilo {

 echo "scale=6
 ($dalton+0.0005)/1000" | bc 
}
########################################################################

# main

########################################################################

while read dalton
do
 convert2kilo
done

以及一个名为input.data

12345.09
236575.665
18865.41
45678.87
1.0008
1.0002

使 shellscript 可执行

chmod ugo+x converter

运行 shell 脚本

$ < input.data ./converter 
12.345090
236.575665
18.865410
45.678870
.001001
.001000
$ 

答案4

假设您有一个名为的文本文件daltons,其中包含要转换的所有数值,位于一列中。

awk '{kDa=$1/1000; print kDa}' daltons >> result

其中kDa是用于存储操作的变量,并将$1取每一行的值。最后,结果存储在文件中result

相关内容