Portál AbcLinuxu, 12. května 2025 06:35

Dotaz: Jak ziskat neobsazenou hodnotu v rade cisel

17.3.2015 07:55 hates | skóre: 30 | blog: Jak_jsem_se_dostal_k_linuxu
Jak ziskat neobsazenou hodnotu v rade cisel
Přečteno: 337×
Odpovědět | Admin
Dostal jsem se do pasti jak vyresit nasledujici problem. Z nekolika serveru si zajistim hromadu cisel, ktere nasledne seradim vzestupne.

Vystup mam nasledujici

101 102 103 107 108 111 112 121 122 123 124 125 126

potreboval bych aby mi script vratil hodnotu 104 coz je prvni hodnota neobsazena. Pokud ji budu mit obsazenou tak vrati 105, atd. V pripade ze posloupnost bude kompletni vrati prvni nejvyssi. v mem pripade 127.

Muzete poradit jak na to.

Momentalne mam skript nasledovne
NODES=$(awk '/mycloud/ { print $1 }' /etc/hosts)

CTID=$(for NODE_IP in ${NODES}; do
  ssh root@${NODE_IP} 'vzlist -a' | awk '/[:alnum:]/ { print $1 }'
done | sort -g | tail -1)

echo ${CTID}
Tento vystup mi vrati 126
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

DaBler avatar 17.3.2015 08:14 DaBler | skóre: 17 | blog: dabler | Brno
Rozbalit Rozbalit vše Re: Jak ziskat neobsazenou hodnotu v rade cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejprve si vygenerujte kompletní sekvenci.

SEQ=$(seq 101 129)

Potom stačí porovnat rozdíly.

diff <(echo "$CTID") <(echo "$SEQ") | grep \> | head -n1 | sed 's/> //'
17.3.2015 08:26 hates | skóre: 30 | blog: Jak_jsem_se_dostal_k_linuxu
Rozbalit Rozbalit vše Re: Jak ziskat neobsazenou hodnotu v rade cisel
Diky, s tim diff me to vubec nenapadlo.
17.3.2015 09:52 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Jak ziskat neobsazenou hodnotu v rade cisel

Jen si nejsem jistý, jestli to tak bude opravdu efektivnější, než tu sekvenci prostě projít cyklem a kontrolovat, jestli je prvek aspoň o dva větší než předchozí (a vypsat poslední plus jedna, když se tam takový nenajde).

Trochu mi to připomíná fóra PHP skriptařů, kde je snaha vyřešit všechno výhradně skládáním hotových funkcí, přestože je výsledek nezřídka zoufale neefektivní a daleko krkolomnější než přímočaré řešení pomocí základních prvků jazyka.

Z hlavy a bez kontroly by to mohlo vypadat nějak takhle:


function hole ()
{
    local prev curr

    for curr in "$@"; do
        if [ -z "$prev" ]; then
            prev="$curr"
            continue
        fi
        if [ $[curr - prev] -gt 1 ]; then
            echo $[prev + 1]
            return
        fi
        prev="$curr"
    done
    echo $[curr + 1]
}
17.3.2015 14:51 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Jak ziskat neobsazenou hodnotu v rade cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin

Velmi snadno si s tím poradí awk. Příklad:

echo 101 102 103 107 108 111 112 121 122 123 124 125 126 |\
awk '{ last = $1; for (i = 2; i <= NF; ++i) { if ($i - last > 1) break; last = $i } print last + 1 }'

Dokonce to zpracuje i víc takových řádků po sobě, když na to přijde.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.