Давайте начнем с простого синтаксиса bash:
Ниже приведены значения, которые у меня есть в массиве
Хорошо, у нас есть массив bash:
arr=(
10.106.86.93,A1,3
10.106.86.93,A2,3
10.106.86.93,A2,3
10.106.86.93,A3,3
10.106.86.93,A3,3
10.106.86.93,A4,3
)
Нужно пройти через это
Ok. Сначала нам нужно вывести массив в виде списка, разделенного новой строкой. Следующее выведет массив:
$ printf "%s\n" "${arr[@]}"
Затем нам нужно прочитать элементы массива и разделить их на разделитель запятых. Мы переменная IFS
для управления тем, какие символы bash разделяет элементы:
printf "%s\n" "${arr[@]}" |
while IFS=, read -r ip A num; do
: # TODO body
done
Ok. Теперь мы можем проверить значение третьего столбца и вывести третий, если оно соответствует 3:
printf "%s\n" "${arr[@]}" |
while IFS=, read -r ip A num; do
if [ "$num" = 3 ]; then
echo "$A"
fi
done
Обратите внимание, что каждый пробел важен. if [[${StatusValue} == "3"}]] then
из вашего кода очень недействительно - вам нужен пробел между [[
и ${..
и пробел между "3"
и ]]
, }
недопустим. Помните, что вы разговариваете с компьютером, используя клавиатуру, и больше ничего - каждое нажатие клавиши имеет значение.
Теперь самая сложная часть:
если последнее значение равно 3, тогда необходимо объединить значение второго столбца
Ну, это просто и быстро сделать с помощью awk
сценариев. Что нам нужно сделать, это создать карту. Нам нужно отобразить значение третьего столбца на два других столбца.
Но давайте сделаем простой, глупый и очень, очень медленный подход:
- Определить уникальные значения в третьем столбце
- Для каждого уникального значения в третьем столбце
- Получить все строки с этим значением в качестве третьего столбца
- Получить первый столбец из любой строки
- Из отфильтрованных строк извлеките второй столбец и объедините их
- Вывести строку
# just to have the array as a string
arrstr=$(printf "%s\n" "${arr[@]}")
# cut only the third column and get unique values
<<<"$arrstr" cut -d, -f3 | sort -u |
# for each unique third column value
while read -r num; do
# get the columns that have that value as the third column
filtered=$(<<<"$arrstr" awk -vIFS=, -vOFS=, '$3 = '"$num")
# get the values of the second field only
# substitute newline for comma
# remove the trailing comma
second_field_sum=$(<<<"$filtered" cut -d, -f2 | tr '\n' ',' | sed 's/,$//')
# get the value of the first field (from the first line)
ip=$(<<<"$filtered" head -n1 | cut -d, -f1)
# output
printf "%s %s %s\n" "$ip" "$second_field_sum" "$num"
done
Пожалуйста, проверьте ваш скрипт на shellcheck.net на наличие ошибок. Ошибки большинства новичков (пропущенные кавычки, опечатки, неправильные перенаправления, синтаксические ошибки if
) легко исправить, просто прослушав сообщения проверки оболочки.