Portál AbcLinuxu, 7. května 2025 05:43

Dotaz: Načtení souboru do pole

14.5.2007 10:43 pok | skóre: 11
Načtení souboru do pole
Přečteno: 1357×
Odpovědět | Admin
Zdravím.

Chci nějak elegantně načíst obsah souboru do pole, řádek po řádku. Původně jsem si to představoval takto:

a=( `cat vstup.txt` )

ale protože na jednotlivých řádcích vstupního souboru je víc slov oddělených mezerou, nedaří se mi. Doufal jsem že toto pomůže:

a=( $( echo $( cat vstup.txt | sed -e "s/\(.*\)/\"\1\"/g" ) ) )

Ale i takto dostávám jednotlivé prvky v poli jako jednotlivá slova v souboru. Pravděpodobně mi uniká nějaké nutné escapování. Napadá někoho něco?

Například:

Pro soubor:
a b
c d e
f g h
dostávám:
echo ${a[2]}
"c
BTW: Toto funguje jak chci:
i=0
while read line; do
  field[$i]="$line"
  i=`expr $i + 1`
done < vstup.txt
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.5.2007 12:11 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: Načtení souboru do pole
Odpovědět | | Sbalit | Link | Blokovat | Admin

Zdravím, ten první příkaz je OK. Stačí předtím nastavit proměnnou IFS pouze na znak nového řádku (protože bash řeže řetězec na tokeny podle znaků v ní nalezených).

Čili:

IFS=$'\n';
a=(`cat vstup.txt`);

S pozdravem
- Vojta

I am always ready to learn although I do not always like to be taught. (W. Churchill)
14.5.2007 12:27 pok | skóre: 11
Rozbalit Rozbalit vše Re: Načtení souboru do pole
Ha, díky!
14.5.2007 18:16 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: Načtení souboru do pole

Ještě jsem si vzpomněl na něco.

  1. Pole má určitě omezenou velikost, takže na velký soubor to asi nebude fungovat (jako maximum bych viděl pár desítek řádků).
  2. Potom by to chtělo obnovit tu IFS na původní hodnotu (takže si na začátku její nastavení zapamatovat do jiné proměnné)

- Vojta

I am always ready to learn although I do not always like to be taught. (W. Churchill)
14.5.2007 12:11 maleprase | skóre: 28
Rozbalit Rozbalit vše Re: Načtení souboru do pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
a v cem ze teda nevyhovuje ten priklad na konci ktery funguje jak chces?
14.5.2007 12:25 pok | skóre: 11
Rozbalit Rozbalit vše Re: Načtení souboru do pole
Nešlo mi ani tak o funkci jako spíš o to, proč to nejde tak jak jsem to zkoušel prvně.
15.5.2007 11:18 mlz | skóre: 12 | blog: Obcas
Rozbalit Rozbalit vše Re: Načtení souboru do pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zdravím, přijde mi řešit to bashem jako plýtvání zdroji a prostředky a beru to tedy jako cvičení. Ale nevím, pro jaké účely, tak asi prudím zbytečně.

Ale existuje sed, awk, perl .. a neřeknu Monty
15.5.2007 13:04 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Načtení souboru do pole
K tomuto komentáři se rád připojím. Pythonní
a = file('vstup.txt').readlines()
Je asi 30x rychlejší než ten příklad v bashi. Soubor s milionem řádků je načtený za 0.7 sekund, zatímco bash se s tím patle 22 sekund. A hlavně - na tak primitivní věc by se v pythonu nikdo neptal, zatímco v bashi je to věda.
Je mi jasné, že autor dotazu ví co dělá, takže toto píšu spíš pro náhodného kolemjdoucího čtenáře.

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.