Bash example using sed, awk, hash arrays: Asociativní pole a porovnávání v awk

test-search-words-2.sh

 

 

#!/bin/bash
declare -A results=()  # Deklarace asociativního pole pro ukládání výsledků globálně

# Funkce pro prohledání slov v textu
search_words() {
    local sql_array="$1"
    local query="$2"
    local words=("${@:3}")
# Importuje pole z třetího argumentu volání funkce
    # local results=()

    sql_array=$(echo "$sql_array" | sed -e 's/^[ \t]*//') # Trim begin of the lines

    # Připojení slova s dotazem k poli. Vytvoření pole slov s query na prvním místě
    local all_words=("$query" "${words[@]}")
    # Procházení slov a hledání jejich výskytu v stringu
    for word in "${all_words[@]}"; do
    result=$(echo "$sql_array" | awk -v word="$word" '$0 ~ word {print NR; exit}')


# PRO AWK JE VELMI SPECIFICKÉ, ŽE PROGRAMÁTOŘI NEPOTŘEBUJÍ ZAPISOVAT PODMÍNKU if, NÝBRŽ ROVNOU ZAPÍŠOU PODMÍNKU PŘED BLOK, bez jakýchkoliv závorek!
# Cyklus for není třeba, protože není třeba procházet sloupce!

# AWK pouze hledá zda se slovo nachází na začátku řádku.

#    result=$(echo "$sql_array" | awk -v word="$word" '{
#        if ($0 ~ word) {
#            print NR;  # Vypíše číslo řádku, pokud se slovo nachází na začátku řádku
#            next;  # Přejde na další řádek
#        }
#           }')

# Toto read -p "string" je můj oblíbený způsob ladění bash skriptu
read -p "WORD:$word RESULT:$result searched in sql_array"
        if [ -z "$result" ]; then
            result=0
        fi
        results["$word"]="$result"  # Uložení výsledku pod klíčem slova
    done

    # Vrácení asociativního pole výsledků
    echo "${results[@]}"
}

# Hlavní kód
clear
sql_array="
    'SELECT'    => 'f.*',
    'FROM'      => array(
        FORUMS_TABLE        => 'f'
    ),
    'LEFT_JOIN' => array(),
    'ORDER_BY'  => 'f.left_id',
    'WHERE'     => 'f.id = 1'
"

# Pole se slovy, která hledáme
# words je běžné pole
words=("FROM" "LEFT_JOIN" "ON" "WHERE")

# Volání funkce pro prohledání slov
search_words "$sql_array" "SELECT" "${words[@]}"

# Vypsání výsledků
echo "SELECT: ${results[0]}"
# hash před názvem pole celého [@] vrací počet prvků v poli
for ((i=1; i<${#words[@]}+1; i++)); do
    echo "${words[i-1]}: ${results[i]}"
 done
read -p "stop"
echo "SELECT: ${results["SELECT"]}"
read -p "Press key to continue"
# Vypsání výsledků
for word in "${!results[@]}"; do
    echo "$word: ${results[$word]}"
done

for word in "${words[@]}"; do
    echo "$word: ${results[$word]}"
done

 

 

Komentáře

Oblíbené příspěvky