txt列中浮动数据与bash的比较
我有数千个文件,其中包含一列非整数数据。 我想构建一个脚本,遍历所有文件夹,检查文件中的值是否等于/不同于0.000000 数据列如下所示:txt列中浮动数据与bash的比较,bash,loops,if-statement,awk,Bash,Loops,If Statement,Awk,我有数千个文件,其中包含一列非整数数据。 我想构建一个脚本,遍历所有文件夹,检查文件中的值是否等于/不同于0.000000 数据列如下所示: -0.572650 -0.002281 -0.080300 -0.803684 -0.498033 -0.206755 -0.182819 -0.222126 -0.116538 0.720913 0.707343 1.134845 -0.462461 -0.382780 -0.378505 -0.436588 -0.464654 -0.207534
-0.572650
-0.002281
-0.080300
-0.803684
-0.498033
-0.206755
-0.182819
-0.222126
-0.116538
0.720913
0.707343
1.134845
-0.462461
-0.382780
-0.378505
-0.436588
-0.464654
-0.207534
-0.231861
-0.155786
-0.196779
0.977137
1.024751
1.037147
我试过这样的方法:
#!/bin/bash
a=$(awk '{print $1}' tmp.txt)
if (( $(echo "$a == 0.000000" |bc -l) ));
then
echo "MULLIKEN MISSING"
elif (( $(echo "$a != 0.000000" |bc -l) ));
then
echo "OK"
fi
但这不是我想要的工作方式
我希望脚本能够检测列中的数据是否都等于0.000000。您好,此代码与您的代码非常相似,应该可以工作
#!/bin/bash
a=$(awk '{print $1}' tmp.txt)
for i in ${a[@]}; do
result=$( echo $i == 0.0 | bc -l)
if [[ $result == "0" ]];
then
echo "OK"
else
echo "NOT OK"
fi
done
请注意,以这种方式使用AWK进行读取,然后使用变量作为数组并不是最安全的方法。我坚持使用AWK:这将非常有效,因为您只需要生成一个进程来处理整个文件,而不是为每个数字调用bc
if awk '$1 == 0 {exit 0} END {exit 1}' file; then
echo "has a zero"
else
echo "no zeroes"
fi
编辑:我有一个逻辑错误:当调用
exit
命令时,将执行awk结束块,因此上述操作将始终退出1
。改用这个:
if awk 'BEGIN {rc = 1} $1 == 0 {rc = 0; exit} END {exit rc}' file; then
echo "has a zero"
else
echo "no zeroes"
fi
或者,找到零时退出1。这简化了awk命令:
if awk '$1 == 0 {exit 1}' file; then
echo "no zeroes"
else
echo "has a zero"
fi
如果您想继续使用纯bash,可以从文件中读取每个数字,并删除点,这样您就只有一个整数(bash中没有浮点)
zero=false
而读取-r值;做
如果((10#${value/./}==0));然后
零=真
打破
fi
完成<文件
$zero&&echo“有零”| | echo“无零”
10#
是强制执行base-10解释,这样bash就不会吐出无效的八进制数,比如080000。你的问题不清楚:你想检查是否有任何值为零,或者所有值是否都为零?嗨!我想检查列中是否有等于零的值。嗨!酷,我明白了。我马上就去试试!谢谢!Onlu最后一个问题:@在变量定义中是什么意思?您需要引用所有变量:“${a[@]}”
,“$i”
——这样您就不会对文件中的意外值感到惊讶。这太可怕了。也用Awk做比较,就像另一个答案建议的那样。非常感谢Glenn!我喜欢awk解决方案!我也会试试这个。
zero=false
while read -r value; do
if (( 10#${value//./} == 0 )); then
zero=true
break
fi
done < file
$zero && echo "has a zero" || echo "no zeroes"