【问题标题】:Comparison of floating data in txt column with bashtxt列中的浮动数据与bash的比较
【发布时间】:2019-07-22 21:00:46
【问题描述】:

我有数千个文件包含一列非整数数据。 我想构建一个遍历所有文件夹的脚本,检查文件中的值是否等于/不同于 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。

【问题讨论】:

  • 您的问题不清楚:您要检查 any 值是否为零,或者 all 值是否为零?
  • 嗨!我想检查列中是否有一个等于零的值。

标签: bash loops if-statement awk


【解决方案1】:

我会坚持使用 awk:这将非常有效,因为您只需要生成一个进程来处理整个文件,而不是为每个数字调用 bc。

if awk '$1 == 0 {exit 0} END {exit 1}' file; then
    echo "has a zero"
else
    echo "no zeroes"
fi

编辑:我有一个逻辑错误:在调用exit 命令时会执行 awk END 块,因此上述将总是退出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
while read -r value; do
    if (( 10#${value//./} == 0 )); then
        zero=true
        break
    fi
done < file

$zero && echo "has a zero" || echo "no zeroes"

10# 强制以 10 为基数进行解释,这样 bash 就不会吐出像 080000 这样的无效八进制数。

【讨论】:

  • 非常感谢格伦!我喜欢 awk 解决方案!我也会试试这个。
【解决方案2】:

您好,这段代码与您的非常相似,应该可以工作。

#!/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读取,然后用变量作为数组不是最安全的方法。

【讨论】:

  • 嗨!酷,我明白了。我马上试试!非常感谢! Onlu最后一个问题:变量定义中的@是什么意思?
  • 您需要引用所有变量:"${a[@]}""$i" -- 这样您就不会对文件中的意外值感到惊讶。
  • 这太可怕了。就像其他答案所暗示的那样,也可以在 Awk 中进行比较。
猜你喜欢
  • 2022-10-14
  • 2016-07-24
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2017-08-20
相关资源
最近更新 更多