从bash脚本中的变量中提取数字

时间:2019-07-10 18:18:57

标签: bash sh

我有一个bash脚本,当我运行test.sh代码时,该脚本会在屏幕上为每个样本编号输出一些统计信息(如下所示的示例)。

我想做的是将输出存储在变量中并提取testNum的平均值-> 11和52

A=`./test.sh`    # I have all the output in a variable A 

现在我需要提取11的平均值-52的-128和-96 我正在尝试并思考如何做到这一点

有人可以帮我吗?

这是示例测试代码:test.sh

#!/bin/sh
echo Valid Numbers per States:3G phones
echo testNum        N_States         Mean Value 
echo    1       10              -128 
echo    2       10      -95 
echo    3       10      -94 
echo    4       10      -94 
echo    5       10      -94 
echo    6       10      -128    
echo    7       10      -91 
echo    8       10      -94 
echo    9       10      -94     
echo    10      10      -94 
echo    11      10      -128    
echo --------------------------------------------   
echo Valid Numbers per States :4G phones        
echo testNum        N_States         Mean Value         
echo    36      10      -95 
echo    40      10      -95 
echo    44      10      -95 
echo    48      10      -95
echo    52      10      -96
echo    56      10      -95
echo    60      10      -96
echo    64      10      -96
echo    100             10      -99
echo    104             10      -97
echo    108             10      -98
echo    112             9       -98
echo    116             9       -98
echo    120             9       -99
echo    124             9       -98 
echo    128             9       -98             
echo    132             9       -98             
echo    136             9       -99             
echo    140             9       -99             
echo    144             9       -99             
echo    149             9       -98             
echo    153             9       -99 
echo    157             9       -99
echo    161             9       -99
echo    165             9       -98
echo --------------------------------------------



我已使用命令echo "$x" | grep -w '^52' | cut -d' ' -f3

但是我的专用硬件上的Linux不允许^(不确定它的版本是什么)..我可以在任何bash shell上运行它。.可以,但是如果我运行相同的命令,则不能输出任何东西。

所以我开始对它做一些awk 这里的温度是128 NF_Est是脚本的输出 echo "$NF_Est" | grep -w 128 | awk '{if ($1==128)print $0}' | tr -s " " | cut -d" " -f3

但是如果我是多列中的“临时”值,这将不起作用

有什么建议可以解决我的问题吗?

2 个答案:

答案 0 :(得分:1)

您可以使用grepcut提取信息:

echo "$x" | grep -w '^11' | cut -d' ' -f3
echo "$x" | grep -w '^52' | cut -d' ' -f3

grep过滤其输入,仅输出与给定模式匹配的行。 ^在行首匹配。 -w的意思是“匹配整个单词”,没有它,它还会输出行 11 2和 11 6。

cut从其输入中提取列。 -d指定定界符,在这种情况下为空格,-f指出要提取的列。

答案 1 :(得分:1)

您真的想要awk

$ ./test.sh | awk '$1==11{print $3}'
-128
$ ./test.sh | awk '$1==52{print $3}'
-96

如果您想从$A中提取值而不是运行脚本,只需执行:echo "$A" | awk ...