txt列中浮动数据与bash的比较

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.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.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"