Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ZAJDAN 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 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
Kód: [Vybrat]
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 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 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 10. 04. 2020, 21:56:40
Použij grep nebo databázi. Bude to i rychlejší.
myslis ? ;-)
Kód: [Vybrat]
echo "prvni druhej treti" | grep 2
kdyz by mel v poli opravdu cisla radku a ne obsah textu tak staci pro detekci "neobsahuje" takto:
Kód: [Vybrat]
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 11. 04. 2020, 12:23:20
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é:
Kód: [Vybrat]
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 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:
Kód: [Vybrat]
#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 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 11. 04. 2020, 14:59:57
...

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 11. 04. 2020, 15:42:50
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:
Kód: [Vybrat]
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:
Kód: [Vybrat]
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}'):
Kód: [Vybrat]
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 11. 04. 2020, 15:56:20
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 11. 04. 2020, 15:58:49
Ahoj...
potřeboval bych porovnat zda se hodnota v proměnné, kterou uživatel dosadí pomocí read vyskytuje v poli
Kód: [Vybrat]
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:
Kód: [Vybrat]
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 11. 04. 2020, 16:30:28

Vieš o tom, že môžeš iterovať skrz prvky poľa porovnáť ich s obsahom premennej naplnenej v read?
Napriklad:
Kód: [Vybrat]
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 11. 04. 2020, 16:47:54
Zkusil jsem si to bez doplňování čísel do souboru
Kód: [Vybrat]
#!/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 11. 04. 2020, 20:30:30
Zkusil jsem si to bez doplňování čísel do souboru
Kód: [Vybrat]
#!/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 12. 04. 2020, 06:00:44
[...] Grepem je to také snadné [...]
narazel sem na to, ze bys v textu grepoval cislo, ktere tam proste nebylo... ;-)