shell - 为什么如果条件为非零条件打印零值?
问题描述
我无法从 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
但它也得到零值。
解决方案
要仅从第 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
推荐阅读
- java - 如何为 TriangleMesh 中的一些三角形着色?
- python - 使用 pytest 进行模拟时出现 ModuleNotFoundError
- salesforce - 如何在出站更改集中将表数据从 SandBox 传输到生产环境?
- python - Apache Beam(2.32.0) 安装失败
- c - 试图制作一个反向循环单链表,其中每个节点都添加到列表的前面,但所有后续节点都丢失了
- mariadb - MariaDB 安装后无法启动
- awk - 从另一个文件中 awk 一个文件的列
- php - 致命错误:未捕获的错误:调用未定义的函数 cal_info()
- java - PostDiscoveryFilter 可以过滤 JUnit5 的参数化测试用例吗?
- vim - 在vim中向上/向下翻页时如何保持光标的垂直位置?