Вы можете разбить свой SQL на базовые процедурные операции и воспроизвести их в сценарии оболочки.
Это, конечно, не очень хорошая идея, поскольку одно из преимуществ декларативных языков (, таких как SQL ), заключается в том, что они скрывают от разработчиков многословие и сложность процедурной реализации, позволяя им сконцентрироваться на данных. (Оптимизация — второе большое преимущество декларативных языков, которое теряется, если вы копируете их с помощью процедурной программы ).
Кроме того, этот подход проблематичен, потому что обработка текста в циклах оболочки обычно считается плохой практикой .
Тем не менее, вот пример сценария оболочки, который использует стандартные утилиты, которые вы найдете предварительно -установленными на многих системах (, за исключением конструкции массива — не указанной в POSIX, но широко доступной,и, безусловно, доступен для вас, поскольку вы спрашиваете оbash
):
#!/bin/bash
# The input file will be passed as the first argument
file="$1"
# For each input line:
# We take only the values of the first field, sort them, remove duplicates
for i in $(cut -d ',' -f 1 "$file" | sort -n -u); do
# Resetting the array is not really needed; we do it for safety
out=()
# The first field of the output row is the key of the loop
out[0]="$i"
# We only consider the rows whose first field is equal
# to the current key (grep) and...
#... we sort the values of the second field
# in ascending order and take only the first one
out[1]="$(grep "^${out[0]}" "$file" | cut -d ',' -f 2 | sort -n | head -n 1)"
#... we sort the values of the third field in
# ascending order and take only the last one
out[2]="$(grep "^${out[0]}" "$file" | cut -d ',' -f 3 | sort -n | tail -n 1)"
#... we sort the values of the fourth field in
# ascending order and take only the first one
out[3]="$(grep "^${out[0]}" "$file" | cut -d ',' -f 4 | sort -n | head -n 1)"
# Finally we print out the output, separating fields with ','
printf '%s,%s,%s,%s\n' "${out[@]}"
done
Он должен вызываться как
./script file
Этот скрипт эквивалентен
SELECT col1, MIN(col2), MAX(col3), MIN(col4)
FROM text
GROUP BY col1
ORDER BY col1
Чтобы указать, что пакет конфликтует в APKBUILD, можно добавить имя пакета с префиксом '!' зависит (см. ссылку APKBUILD).
depends=".. !perl"
Вы также можете добавить опцию provides
:
provides="perl=$pkgver-r$pkgrel"
Это гарантирует, что любые пакеты, зависящие от perl, смогут использовать вместо него этот пакет.