从 text1 读取并写入 text2

从 text1 读取并写入 text2

我是 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

相关内容