我是 Shell 脚本的新手。
我想编写一个脚本来读取 text1 文件并从该文件中获取一个值。
这是文本文件的内容:
L_T4000-Level3-Ouerdia 6679088203.600000 1523.208000
L_T4000-Level3-Ouerdiaa 8230141220.800000 1526.263200
L_T4000-nodeATI_Wardiaa 444039671.536000 4091589798.080000
L_T4000-node_TIS 6663189651.680000 2080241494.000000
L_T4000-node_TISa 6636796103.440000 2044580242.080000
L_International_node-globe 115911592756.879990 22433604426.723553
L_CRS_X-node06788 4801933455.200000 1329.232178
L_CRS_X-node06852 7100165206.800000 1630.996089
L_CRS_X-node06852a 7841650889.760000 1176446198.640000
我想从行中获取第一个值L_International_node-globe
并将该值格式化为浮点数,然后将新值写入文本文件2
在这个例子中,输出应该是值“115911592756,879990”,并且这个值应该存储在另一个文本文件中。
您如何看待这段代码:
#!/bin/bash
text1="/path/to/filename1"
text2="/path/to/filename2"
var=0
grep 'L_International_node-globe' text1|tr -s ' ' '\t'|cut -f 2 | sed 's/\./,/' > $var
$var=$var/1000000000 #the result should be in Gigabits
echo $var > text2 #on every execution text2 should have a new value
该脚本应该每5分钟执行一次,那么您认为资源利用率如何?
答案1
假设“浮点数”指的是[-]d.ddde±dd
“科学计数法”,那么你可以使用awk
awk '/L_International_node-globe/ {printf("%e\n", $2)}' text1 > text2
%g
如果您希望格式根据指数的大小在%f
和之间改变,则可以使用说明符。%e
答案2
原始答案
以下命令行应该可以执行您想要的操作,
grep 'L_International_node-globe' text1|tr -s ' ' '\t'|cut -f 2 > text2
- 打印出你想要从文件中获取的关键字(和值)的行
text1
- 将空格分隔符转换为 TAB
- 打印第二个字段(关键字后的第一个字段)
- 将输出重定向到文件
text2
我不太清楚你说的浮点数是什么意思。shell 会打印字符串,而各种程序都可以将其解释为浮点数格式的数字。
编辑1
好的,您需要用逗号作为小数分隔符。这可以通过sed
替换来实现。
grep 'L_International_node-globe' text1|tr -s ' ' '\t'|cut -f 2 | sed 's/\./,/' > text2
编辑2
针对您建议的 shellscript,我建议使用以下修改版本,
#!/bin/bash
if [ $# -ne 2 ]
then
echo "
Usage: $0 <path/infile> <path/outfile>
Example: $0 text1 text2"
exit
fi
# extracting the value
var=$(grep 'L_International_node-globe' "$1"|tr -s ' ' '\t'|cut -f 2)
echo "debug1: $var"
# install and use 'bc'
# calculation; 'scale' sets the number of decimals in the output (truncated)
var=$(echo "scale=3
$var/1000000000" | bc) #the result should be in Gigabits
echo "debug2: $var"
# conversion to comma as decimal separator
var=${var/./,}
echo "debug3: $var"
echo "$var" > "$2" # after every execution the output file should have a new value
来自您原始问题的数据示例,
$ ./scriptname
Usage: ./scriptname <path/infile> <path/outfile>
Example: ./scriptname text1 text2
$ ./script-name text1 text2 ; echo '-----------';cat text2
debug1: 115911592756.879990
debug2: 115.911
debug3: 115,911
-----------
115,911