Вы должны добавить точку с запятой ;
в операторе if
перед then
и в for
перед do
. Если больше нет проблем, он должен работать. Также я не улучшаю ваш сценарий.
Сценарий.
for CHECK in $(awk '{print $1}' hello | grep count=| cut -d"=" -f1); do
if [ $(grep $CHECK output.txt | awk '{print $2}') -ne 0 ]; then
echo "$(grep $CHECK output.txt)" | mailx -s "CHECK ABC PROCESS" foo@bar.com
fi
done
Кроме того, вы не должны использовать команду cut
как эту cut -d"=" -f2
, чтобы получить числовое значение? также лучше запускать свои команды вне цикла, чтобы увидеть, получили ли вы какой-либо результат или нет.
parallel echo "{1},{2}" :::: <(cut -d' ' -f1 file) :::: <(cut -d' ' -f2 file) |
awk -F, '{ print $1,$2,$1"/"$2,$1/$2 }' OFS=, OFMT='%.2g'
Выход:
1,2,1/2,0.5
1,5,1/5,0.2
1,8,1/8,0.12
1,18,1/18,0.056
1,5,1/5,0.2
1,19,1/19,0.053
3,2,3/2,1.5
3,5,3/5,0.6
3,8,3/8,0.38
3,18,3/18,0.17
3,5,3/5,0.6
3,19,3/19,0.16
4,2,4/2,2
4,5,4/5,0.8
4,8,4/8,0.5
4,18,4/18,0.22
4,5,4/5,0.8
4,19,4/19,0.21
9,2,9/2,4.5
9,5,9/5,1.8
9,8,9/8,1.1
9,18,9/18,0.5
9,5,9/5,1.8
9,19,9/19,0.47
3,2,3/2,1.5
3,5,3/5,0.6
3,8,3/8,0.38
3,18,3/18,0.17
3,5,3/5,0.6
3,19,3/19,0.16
4,2,4/2,2
4,5,4/5,0.8
4,8,4/8,0.5
4,18,4/18,0.22
4,5,4/5,0.8
4,19,4/19,0.21
Этот фрагмент сценария bash считывает текстовый файл с именем numbers.txt
в формате, указанном в вашем вопросе, и выводит CSV-файл, разделенный двоеточиями, каждая строка в формате:
Dividend;divisor;fraction;decimal
Для десятичных вычислений используется инструмент bc
.
#!/bin/bash
declare -a Dividend Divisor
while read -r Line; do
if [ -n "$Line" ]; then
Dividends+=("${Line%% *}")
s="${Line#* }"
Divisors+=("${s%% *}")
fi
done < test.txt
for dividend in "${Dividends[@]}"; do
for divisor in "${Divisors[@]}"; do
echo "$dividend;$divisor;$dividend/$divisor;$(bc <<<"scale=5; $dividend/$divisor")"
done
done
Он считывает весь файл в два массива Dividends
и Divisors
и перебирает их во вложенных циклах (полное декартово произведение ). Таким образом, каждое делимое делится на каждый делитель.
c1="{$(cut -d' ' -f1 file | paste -sd,)}"
c2="{$(cut -d' ' -f2 file | paste -sd,)}"
echo echo $c1,$c2 |
bash |
tr ' ' '\n' |
awk -F, '{ print $0, $1"/"$2, $1/$2 }' OFS=, OFMT='%.2g'
Выход:
1,2,1/2,0.5
1,5,1/5,0.2
1,8,1/8,0.12
1,18,1/18,0.056
1,5,1/5,0.2
1,19,1/19,0.053
3,2,3/2,1.5
3,5,3/5,0.6
3,8,3/8,0.38
3,18,3/18,0.17
3,5,3/5,0.6
3,19,3/19,0.16
4,2,4/2,2
4,5,4/5,0.8
4,8,4/8,0.5
4,18,4/18,0.22
4,5,4/5,0.8
4,19,4/19,0.21
9,2,9/2,4.5
9,5,9/5,1.8
9,8,9/8,1.1
9,18,9/18,0.5
9,5,9/5,1.8
9,19,9/19,0.47
3,2,3/2,1.5
3,5,3/5,0.6
3,8,3/8,0.38
3,18,3/18,0.17
3,5,3/5,0.6
3,19,3/19,0.16
4,2,4/2,2
4,5,4/5,0.8
4,8,4/8,0.5
4,18,4/18,0.22
4,5,4/5,0.8
4,19,4/19,0.21
rows = open("file.txt", "r").read().split("\n")
for r in rows[:-1]:
r = r.split(" ")
print("%s,%s,%s/%s,%.2f" % (r[0], r[1], r[0], r[1], int(r[0])/int(r[1])))
Для файл.txt:
1 2
3 5
4 8
9 18
3 5
4 19
вы получите:
1,2,1/2,0.50
3,5,3/5,0.60
4,8,4/8,0.50
9,18,9/18,0.50
3,5,3/5,0.60
4,19,4/19,0.21