Обход плавающего массива для сравнения в bash
Я извлекаю столбец с плавающей точкой из файла 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
если я заменю >=
с -ge
тогда я получаю эту ошибку:
integer expression expected
1 ответ
Следующая команда выдает ту же ошибку
[ -eq 1 ]
это может произойти, если вывод bc пуст, что происходит в случае ошибки
простой обходной путь должен обрабатывать пустой вывод, как
[[ $(bc -l <<<"${row_arr[$i]} >= $sub_val") != 1 ]]
- Двойная скобка анализируется по-разному, если первое раскрытие пусто, первый аргумент является пустой строкой
!=
это сравнение строк, обрабатывает пустую строку, тогда как-eq
требуется целое число, потому что вывод bc может быть0
1
или же