Bash - zjištění zda hodnota z 'read' je obsažena v array

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
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
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.


k3dAR

  • *****
  • 2 838
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #1 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 :)

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #2 kdy: 10. 04. 2020, 20:28:19 »
Použij grep nebo databázi. Bude to i rychlejší.

k3dAR

  • *****
  • 2 838
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #3 kdy: 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...)

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #4 kdy: 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.


ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #5 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:
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"
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #6 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.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #7 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.

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #8 kdy: 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.
« Poslední změna: 11. 04. 2020, 15:44:42 od ZAJDAN »
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #9 kdy: 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
« Poslední změna: 11. 04. 2020, 15:59:17 od A.P.Hacker »

Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #10 kdy: 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
« Poslední změna: 11. 04. 2020, 16:02:07 od nehalem »

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #11 kdy: 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ý
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #12 kdy: 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

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #13 kdy: 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
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

k3dAR

  • *****
  • 2 838
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
Re:Bash - zjištění zda hodnota z 'read' je obsažena v array
« Odpověď #14 kdy: 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... ;-)