首页 > 解决方案 > 为什么如果条件为非零条件打印零值?

问题描述

我无法从 bash 代码中获得所需的输出。

我有一个文本文件:

1 0.00 0.00    
2 0.00 0.00    
3 0.00 0.08    
4 0.00 0.00    
5 0.04 0.00    
6 0.00 0.00    
7 -3.00 0.00 
8 0.00 0.00   

所需的输出应该只是非零值:

0.08   
0.04   
-3.0

这是我的代码:

z=0.00
while read line
do
line_o="$line"
openx_de=`echo $line_o|awk -F' ' '{print $2,$3}'`   
IFS=' ' read -ra od <<< "$openx_de"
for i in "${od[@]}";do
if [ $i != $z ]
then
echo "openx_default_value is $i"
fi
done
done < /openx.txt

但它也得到零值。

标签: shell

解决方案


要仅从第 2 列和第 3 列获取非零值,请尝试:

$ awk '$2+0!=0{print $2} $3+0!=0{print $3}' openx.txt 
0.08
0.04
-3.00

这个怎么运作:

$2+0 != 0 {print $2}测试第二列是否为非零。如果它不为零,则执行打印语句。

我们想在第二列$2和 0 之间进行数值比较。为了告诉 awk 将$2其视为一个数字,我们首先将零添加到它,然后我们进行比较。

第 3 列也是如此。

使用列名

考虑这个输入文件:

$ cat openx2.txt 
n  first  second
1  0.00   0.00
2  0.00   0.00
3  0.00   0.08
4  0.00   0.00
5  0.04   0.00
6  0.00   0.00
7 -3.00   0.00    8  0.00  0.00

要打印找到的每个值的列名,请尝试:

$ awk 'NR==1{two=$2; three=$3; next} $2+0!=0{print two,$2} $3+0!=0{print three,$3}' openx2.txt 
second 0.08
first 0.04
first -3.00

推荐阅读