Portál AbcLinuxu, 10. května 2024 06:05


Dotaz: Postupne nacitani prvnich dvou souboru z mnoha v BASHi

tomes.io avatar 20.10.2012 17:01 tomes.io | skóre: 12 | blog: tomesh
Postupne nacitani prvnich dvou souboru z mnoha v BASHi
Přečteno: 182×
Odpovědět | Admin
Ahoj,

napsal jsem si skriptik, ktery mi porovnava vzdy prave dva textove soubory:
#! /bin/bash
  
input1="$1"
input2="$2"
  
while read line
do
        if grep -e "$line" "$input2" &>/dev/null
        then
           echo "..." >/dev/null
        else
                sed -i "s#$line#!$line#g" "$input1" "$input2"
        fi
done <"$input1"

while read line
do
        if grep -e "$line" "$input1" &>/dev/null
        then
           echo "..." >/dev/null
        else
                sed -i "s#$line#!$line#g" "$input2" "$input1"
        fi
done <"$input2"
Jenze takovych souboru, potrebuju naraz zpracovat stovky. Dejme tomu, ze mam skript v adresari, kde jsou jenom ty .txt soubory. Chtel bych skript spustit tak, aby si vzal prvni dva soubory, zpracoval je, pak si vzal dalsi dva, dalsi dva atd. az by zpracoval o dvojicich vsechny soubory z adresare.

SOubory jsou pojemnovany takto:
01.txt.identifikacnicislo, 01.txt.jineidentifikacnicislo, 02.txt.identifikacnicislo, 03.txt.ID ...
Budu rad za jakoukoliv pomoc. Diky,

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

20.10.2012 18:01 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Postupne nacitani prvnich dvou souboru z mnoha v BASHi
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokiaľ sa tie súbory líšia v sekvencii a naraz ich môže byť 98 (pri vynechaní kombinácie 00.txt.identifikacnicislo), tak ich vylistujeme a zoberieme prvé dva: ls -1 | sort -n | head -2

ale, v praxi to bude vyzerať inak.
20.10.2012 18:12 l4m4
Rozbalit Rozbalit vše Re: Postupne nacitani prvnich dvou souboru z mnoha v BASHi
Odpovědět | | Sbalit | Link | Blokovat | Admin
Předně bych asi naráz našel řádky, které jsou v input2 ale nejsou v input1. Pokud se řádky v input2 neopakují, je to snadné:
sort $input1 $input1 $input2 | uniq -u >only2
Následně s klidem používáš řádky coby regulární výrazy. To samozřejmě nebude dělat to, co má, když budou obsahovat znaky, které mají v regexpu speciální význam, je zapotřebí je oescapovat. Přitom se rovnou mohou upravit na regulární výrazy pro úpravu input1
sed -i 's#[...]#\\\0#g;s#.*#s/^\0$/!\\0/#' only2
           ^^^ sem přijde seznam těch speciálních znaků  
A pak se už akorát input1 upraví pomocí only2
sed -i -f only2 $input1
Tvůj skript provádí vždy modifikaci input1 i input2, ale když input2 ten řádek neobsahuje, tak není co modifikovat a toto je reundantní -- pokud jsem pochopil správně, co to má dělat, možná by nebylo na škodu to popsat i slovně.

Analogicky křížem. V tomto ohledu by mi přišlo přirozenější nejdřív vygenerovat skripty v sedu only2 a only1, pak je teprve použít na příslušné soubory. Ale možná úloha vyžaduje aby výsledek zpracování závisel na tom, co s křížovým souborem provedlo v prním kroku... Opět by to vyjasnil slovní popis.

tomes.io avatar 20.10.2012 19:08 tomes.io | skóre: 12 | blog: tomesh
Rozbalit Rozbalit vše Re: Postupne nacitani prvnich dvou souboru z mnoha v BASHi
Priznam se, ze moc nerozumim tomu, jak by
sort $input1 $input1 $input2 | uniq -u >only2
vyresil muj problem. Nijak nevidim, jak by si tento prikaz bral z adresare postupne dva a dva soubory za sebou atakdale az by projel cely adresar...Nebo mi neco unika.. nejsem v bashi zbehly. V promennych input1 a input2 jsou preci jmena dvou soboru, ktere skriptu zadam:
./compare.sh soubor1 soubor2
Ale ty jmena souboru mu zadam ja rucne na vstupu z commandlajny. A ja potrebuju to zadavani zautomatizovat tak, jak jsem popsal vyse.

Ja bych potreboval asi nejaky regexp, ktery by skriptu jako parametry postupne prirazoval prvni dva soubory z adresare, pak dalsi dva soubory atd. rozumis.

Jinak v souborech nejsou redundantni radky (to je osetrene jinym skriptem uz). Cili na vstupu se predpokladaji dva txt soubory, na stejnych radcich maji stejne vety a ty se porovnavaji, resp se hledaji preklepy. pokud se njde nesrovnalost, skript v obou souborech oznaci zacatek prislusneho radku vykricnikem. Tim oznaci ze vetu nejsou stejne.
20.10.2012 19:12 l4m4
Rozbalit Rozbalit vše Re: Postupne nacitani prvnich dvou souboru z mnoha v BASHi
Myslel jsem, že je problém v tom, že použití takové monstrozity, kde se soubory čtou v shellu po řádcích a po každém přečteném řádku se spouštějí nějaké programy, je na stovky souborů nepoužitelně pomalé. Tudíž jsem navrhl, jak každou dvojici kompletně zpracovat pomocí pár příkazů.
tomes.io avatar 20.10.2012 19:56 tomes.io | skóre: 12 | blog: tomesh
Rozbalit Rozbalit vše Re: Postupne nacitani prvnich dvou souboru z mnoha v BASHi
No dobre, ale to porad neresi, jak do skriptu dostat vzdycky postupne ty dva a dva soubory ke zpracovani :) Odhledneme ted od toho, jakym zpusobem ten skript soubory zpracovava. Otazka zni, jak na jeho vstup, jako parametry, dostat vzdy dva a dva soubory postupne z celeho adresare....
20.10.2012 20:06 l4m4
Rozbalit Rozbalit vše Re: Postupne nacitani prvnich dvou souboru z mnoha v BASHi
To popsal Kit, nicméně to je ta jednoduchá část...
20.10.2012 19:44 Kit
Rozbalit Rozbalit vše Re: Postupne nacitani prvnich dvou souboru z mnoha v BASHi
Není lepší místo compare.sh použít diff?
#!/bin/sh
while test "$#" -gt 0; do
  diff "$1" "$2"
  shift 2
done
tomes.io avatar 20.10.2012 19:52 tomes.io | skóre: 12 | blog: tomesh
Rozbalit Rozbalit vše Re: Postupne nacitani prvnich dvou souboru z mnoha v BASHi
Ja potrebuju porovnavat radek po radku, aby mohl oznacit konkretni radky. Tvuj skript porovnava cele soubory a nepamatuju se, ze by diff umoznoval takovou praci s radky, ktera by mi umoznila je oznacovat tak, jak jsem popsal vyse.
20.10.2012 19:58 Kit
Rozbalit Rozbalit vše Re: Postupne nacitani prvnich dvou souboru z mnoha v BASHi
Ale na tvou původní otázku jsem ti snad odpověděl, nebo snad ne? Jestli to potřebuješ polopatě, tak tady:
#!/bin/sh
while test "$#" -gt 0; do
  compare.sh "$1" "$2"
  shift 2
done
Jinak compare.sh si můžeš nadefinovat i jako funkci. Tím se to dost urychlí.
tomes.io avatar 20.10.2012 20:25 tomes.io | skóre: 12 | blog: tomesh
Rozbalit Rozbalit vše Re: Postupne nacitani prvnich dvou souboru z mnoha v BASHi
Ajo, jo uz mi to docvaklo. Diky. Ja obcas potrebuju veci vysvetlit polopaticky ;)

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.