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