【问题标题】:Traversing floating array for comparison in bash遍历浮动数组以在bash中进行比较
【发布时间】:2017-10-09 09:04:28
【问题描述】:

我正在从 csv 文件中提取浮点列并存储在 row_arr 数组中。接下来将sub_val 中的存储值与数组元素进行比较。我想将匹配元素的索引存储在变量中。我有以下代码和错误。

declare -a fileList=(
"file-a"
"file-b"
"file-c"
)

loc='../myData/'

file_name="sample.csv"
png='.png'
sep=', '
txt='.txt'

fileList_size="$(echo ${#fileList[@]})"

row_no=1
counter=0
counter2=0

for j in "${fileList[@]}"
do
        echo "Sub Row No = "$row_no
        #Picking value from 2nd column for other sample file
        sub_val=($(awk -F, 'FNR = "'"$row_no"'" {print $2}' $file_name))

        #### Storing Time Sequence in Array from Other File
        while IFS=, read -a csv_line;
        do 
            row_arr[$rc]=${csv_line[0]};
            #echo "This is row array"
            echo ${row_arr[$rc]}
            ((rc++))
        done < $loc${j}$txt

        row_arr_size="$(echo ${#row_arr[@]})"

        for ((i = 0; i < ${#row_arr[@]}; ++i));
        do

            if [ $(echo "${row_arr[$i]} >= $sub_val" | bc -l) -eq 1 ]
            then
                    echo ${row_arr[$i]} ">=" $sub_val
                    p='p'
                    pos=$i
                    echo "Index is="$pos

                    got_row=$pos
                    got_value="$(echo `sed -n $pos$p $loc${j}$txt`)"

                    echo "File="$loc${j}
                    echo "Row No="$got_row
                    echo "Value="$got_value
                    echo "Counter="$counter2
                    echo "##################################################################"

                    break

            fi
        done

                counter2=$[$counter2+1]
                if [ $counter2 -eq $fileList_size ]
                then
                    echo $counter2
                    exit 1
                fi
        row_no=$[$row_no+1]
        counter=$[$counter+1]
done

我得到这个错误:

[: -eq: unary operator expected

如果我将&gt;= 替换为-ge,则会出现此错误:

integer expression expected

【问题讨论】:

  • 仅 sn-p 就表明使用其他语言会更轻松。
  • 顺便说一句——在一个格式正确的问题中,上面的代码是minimal reproducible example,提供了其他人重现错误(或测试他们提出的修复)所需的一切。 Nahuel 的回答涵盖了最可能的原因,但我们不能说这是某些原因,因为问题中的代码不能独立运行(它不是t 实际设置您正在使用的 row_arri 值)。

标签: bash shell linux-mint awk


【解决方案1】:

以下命令给出相同的错误

[  -eq 1 ]

如果bc输出为空就会出现这种情况,如果出错就会出现这种情况

一个简单的解决方法是像处理空输出

[[ $(bc -l <<<"${row_arr[$i]} >= $sub_val") != 1 ]]
  • 如果第一个扩展为空,则双括号的解析方式不同,第一个参数为空字符串
  • != 是字符串比较,处理空字符串,而 -eq 需要整数,因为 bc 输出可以是 0 1

【讨论】:

  • 是的,你是对的,sub_val 是空的,我发现如果你编辑你的 csv 文件,其中的值已经用逗号和空格分隔,并保存在 LibreCal 中,那么它将通过省略空格来覆盖以前的设置并分隔值。这就是sub_val=($(awk 'FNR == "'"$row_no"'" {print $2}' $file_name)) 不起作用的原因,我无法获得价值。程序正在运行,但错误仍然存​​在。不知道有没有语法错误。
  • 这部分不在第一个问题中,但 sub_val=($(awk 'FNR == "'"$row_no"'" {print $2}' $file_name)) 由于括号而无法工作,这意味着 sub_val 是一个数组,如果输出可能你只需要 sub_val=$(awk 'FNR == "'"$row_no"'" {print $2}' $file_name)
  • 如果输入是 csv 必须设置 awk 参数 -F 例如awk -F"," ...
  • 尝试了所有不同的方法,都不起作用。 sub_val=$(awk -F 'FNR == "'"$row_no"'" {print $2}' $file_name) sub_val=($(awk -F 'FNR == "'"$row_no"'" {print $2}' $file_name)) 错误仍然存​​在。
  • 要指定字段分隔符,awk -F 必须后跟一个字符,以防多个字符是正则表达式分隔符,因此:ub_val=$(awk -F, 'FNR == '"$row_no"' {print $2}' "$file_name") 以防字段由逗号分隔。
猜你喜欢
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
相关资源
最近更新 更多