Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ZAJDAN kdy 09. 04. 2020, 23:08:25

Název: Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: ZAJDAN kdy 09. 04. 2020, 23:08:25
Ahoj...
potřeboval bych porovnat zda se hodnota v proměnné, kterou uživatel dosadí pomocí read vyskytuje v poli
mapfile -t array < /home/brumla/seznam #vznikne pole s čísly řádků
read -p "zadej číslo řádku" ROW
if [[ "$ROW" != "${array[@]}" ]]; then
echo "špatný řádek"


vůbec mne nenapadá jak v případě proměnné vytvořené přes 'read' vytvořit v následující podmínce cyklus který by ji porovnal vůči array.

díky
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: k3dAR kdy 10. 04. 2020, 19:01:12
lip popis co presne chces, a pridej vzorovej soubor seznam...

protoze to jak to ted (chapu ze spatne) mas, ti udela to ze kdyz zadas radek c.: 1 porovnava to s "text_prvniho_radku text_druheho_radku atd..."

takze bud chces mit v poli cisla radku a pak neporovnavat cele promene, ale zda se cislo radku vyskytuje nekde v poli,
nebo chces neco uplne jineho :)
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: Kit kdy 10. 04. 2020, 20:28:19
Použij grep nebo databázi. Bude to i rychlejší.
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: k3dAR kdy 10. 04. 2020, 21:56:40
Citace od: Kit kdy 10. 04. 2020, 20:28:19
Použij grep nebo databázi. Bude to i rychlejší.
myslis ? ;-)
echo "prvni druhej treti" | grep 2

kdyz by mel v poli opravdu cisla radku a ne obsah textu tak staci pro detekci "neobsahuje" takto:
if [[ ${array[@]} != *$ROW* ]]; then echo "špatný řádek"; fi
(tedy $ROW obalit mezi hvezdicky...)
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: Kit kdy 11. 04. 2020, 12:23:20
Citace od: k3dAR kdy 10. 04. 2020, 21:56:40
Citace od: Kit kdy 10. 04. 2020, 20:28:19
Použij grep nebo databázi. Bude to i rychlejší.
myslis ? ;-)

DB4 mi na notebooku zvládá 200k dotazů za sekundu. Pokud je těch řádek víc než jen pár set, tak je to určitě výhodnější řešení.

Grepem je to také snadné:
grep '^'"$ROW"'$' </home/brumla/seznam

V neposlední řadě bych se zamyslel nad tím, jak asi ten soubor vznikl a proč se ten soubor prohledává. Pokud je nutné zabránit nějakým duplicitám, tak se to v databázi dá realizovat mnohem jednodušeji - například v SQLite je vložení i s kontrolou duplicity na jeden řádek.
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: ZAJDAN kdy 11. 04. 2020, 13:28:41
Omlouvám se, následně jsem si uvědomil, že array pomocí 'mapfile' není array obsahující počty řádků.
Vyřešil jsem to tedy takto:

#spočítej řádky
rows=$(wc -l /home/brumla/seznam | awk '{ print $1 }')

#vytvoř pole a naplň ho dle spočtených řádků
declare -a schemas
for (( i = 1; i <= $rows; ++i )); do
schemas+=("$i")
done

read -p "zadej číslo schématu" SCHEMA
#pokud číslo není ve schématu zvolej Zdar
if ! [[ ${schemas[*]} =~ "$SCHEMA" ]]; then
echo "Zdar"
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: redustin kdy 11. 04. 2020, 14:15:26
Z vlastní zkušenosti bych doporučil zvážit, zda pro složitější bashovské skripty (např. vyžadující pole) nepoužít python. Obzvláště pokud můžeš použít nějaké IDE s krokováním, výpisem proměnných atd.
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: Kit kdy 11. 04. 2020, 14:59:57
Citace od: ZAJDAN kdy 11. 04. 2020, 13:28:41
...

K čemu je tohle vše dobré? Vždyť by to dokázal vyřešit jediný řádek.
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: ZAJDAN kdy 11. 04. 2020, 15:42:50
Citace od: Kit kdy 11. 04. 2020, 14:59:57
K čemu je tohle vše dobré? Vždyť by to dokázal vyřešit jediný řádek.
1. script spustí SQL příkaz a výstup uloží do souboru:
dbName
"DEMOCZ"
"DEMOEN"
"DEMOTH"
3 rows selected (overall time 5219.689 msec; server time 608 usec)

2. pomocí 'sed' vyjmu prvni a poslední řadek, smažu všechny uvozovky a zůstane:
DEMOCZ
DEMOEN
DEMOTH

Přes mapfile mám pole s názvy selektovaných schémat, které pak dle potřeby dosazuju.

3.uživatel dostane možnost si přes 'read' vybrat DB schema, ale já nechci aby musel zadávat jeho název, proto do výstupu uloženého v souboru vložím čísla řádků
(awk '{print NR, "\t", $0}'):
1 DEMOCZ
2 DEMOEN
2 DEMOTH

Zde uživatel zadává číslo schématu, proto jsem potřeboval udělat pole s počtem řádků a dle toho si definovat podmínky. Chtěl jsem si to celé udělat v bashi.
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: Google CTCCTCGGCGGGCACGTAG kdy 11. 04. 2020, 15:56:20
Citace od: redustin kdy 11. 04. 2020, 14:15:26
Z vlastní zkušenosti bych doporučil zvážit, zda pro složitější bashovské skripty (např. vyžadující pole) nepoužít python. Obzvláště pokud můžeš použít nějaké IDE s krokováním, výpisem proměnných atd.

krokovani v bashi neni problem, existuje bashdb, ale jinak souhlas, s Pythonem nebo Ruby se pracuje lepe
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: nehalem kdy 11. 04. 2020, 15:58:49
Citace od: ZAJDAN kdy 09. 04. 2020, 23:08:25
Ahoj...
potřeboval bych porovnat zda se hodnota v proměnné, kterou uživatel dosadí pomocí read vyskytuje v poli
mapfile -t array < /home/brumla/seznam #vznikne pole s čísly řádků
read -p "zadej číslo řádku" ROW
if [[ "$ROW" != "${array[@]}" ]]; then
echo "špatný řádek"


vůbec mne nenapadá jak v případě proměnné vytvořené přes 'read' vytvořit v následující podmínce cyklus který by ji porovnal vůči array.

díky
Vieš o tom, že môžeš iterovať skrz prvky poľa porovnáť ich s obsahom premennej naplnenej v read?
Napriklad:

for i in "${ARR[@]}"; do [[ $VAR =~ $i ]] && echo $i; done
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: ZAJDAN kdy 11. 04. 2020, 16:30:28
Citace od: nehalem kdy 11. 04. 2020, 15:58:49

Vieš o tom, že môžeš iterovať skrz prvky poľa porovnáť ich s obsahom premennej naplnenej v read?
Napriklad:

for i in "${ARR[@]}"; do [[ $VAR =~ $i ]] && echo $i; done

super...tohdle by se mi mohlo hodit abych nemusel manuálně vytvářet podmínky pro proměnnou z 'read', protože pokaždé bude počet prvků v poli jiný
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: Kit kdy 11. 04. 2020, 16:47:54
Zkusil jsem si to bez doplňování čísel do souboru
#!/bin/bash

mapfile -t array < <(
echo 'dbName
"DEMOCZ"
"DEMOEN"
"DEMOTH"
3 rows selected (overall time 5219.689 msec; server time 608 usec)
' | sed -ne '/^"/s/"//gp'
)

read -p "zadej číslo řádku: " ROW
if [[ -n "${array[$ROW-1]}" ]]; then
    echo "${array[$ROW-1]}"
fi
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: ZAJDAN kdy 11. 04. 2020, 20:30:30
Citace od: Kit kdy 11. 04. 2020, 16:47:54
Zkusil jsem si to bez doplňování čísel do souboru
#!/bin/bash

mapfile -t array < <(
echo 'dbName
"DEMOCZ"
"DEMOEN"
"DEMOTH"
3 rows selected (overall time 5219.689 msec; server time 608 usec)
' | sed -ne '/^"/s/"//gp'
)

read -p "zadej číslo řádku: " ROW
if [[ -n "${array[$ROW-1]}" ]]; then
    echo "${array[$ROW-1]}"
fi

super! moc díky
Název: Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
Přispěvatel: k3dAR kdy 12. 04. 2020, 06:00:44
Citace od: Kit kdy 11. 04. 2020, 12:23:20
[...] Grepem je to také snadné [...]
narazel sem na to, ze bys v textu grepoval cislo, ktere tam proste nebylo... ;-)