Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Kaktus 03 Května 2011, 19:54:36

Název: "Vytípání" textu z dokumentu
Přispěvatel: Kaktus 03 Května 2011, 19:54:36
Potřeboval bych poradit, jakým způsobem lze automatizovaně (ideálně přes řádek) vybrat z dokumentu (doc, txt) určitý druh informací a uložit ho do souboru s příslušným názvem. Konkrétně mám dokument, v němž je mnoho řádků, vypadajících dejme tomu takto:
Kód: [Vybrat]
http://rapidshare.com/files/288844977/ahoj.part01.rar
http://rapidshare.com/files/288844897/nazdar.part02.rar
http://rapidshare.com/files/288844937/ahoj.part02.rar
http://rapidshare.com/files/288845937/nazdar.part01.rar
http://rapidshare.com/files/288844672/nazdar.part03.rar
http://rapidshare.com/files/288844871/ahoj.part03.rar
a chtěl bych dosáhnout stavu, kdy se mi jednotlivé související řádky uloží do textového souboru s příslušným názvem. Pokud se budu dále držet příkladu, tak bych chtěl, aby se mi vytvořil soubor ahoj.txt, který bude obsahovat
Kód: [Vybrat]
http://rapidshare.com/files/288844977/ahoj.part01.rar
http://rapidshare.com/files/288844937/ahoj.part02.rar
http://rapidshare.com/files/288844871/ahoj.part03.rar
a soubor nazdar.txt, který bude obsahovat
Kód: [Vybrat]
http://rapidshare.com/files/288845937/nazdar.part01.rar
http://rapidshare.com/files/288844897/nazdar.part02.rar
http://rapidshare.com/files/288844672/nazdar.part03.rar

Jedná se samozřejmě o ilustrativní příklad, ve skutečnosti těch řádků v jednom texťáku mám mnoho s mnoha názvy, nicméně mají podobnou strukturu, tudíž bych toho využil a název souboru bych vždy stanovil podle klíče *.part (tzn. programu by se řeklo "vytvoř soubor s názvem, který je před slovem .part /případně .rar/ a všechny ostatní řádky, které toto slovo obsahují, do něj zapiš"). Lze to nějak jednoduše?
Název: Re: "Vytípání" textu z dokumentu
Přispěvatel: TIBOR 03 Května 2011, 20:13:10
Skus
Kód: [Vybrat]
cat | grep -i nazdar subor_odkial > subor_kam.txtcat - vypis
| grep -i nazdar -vyselektuj riadky zo slovom nazdar a ignoruj velkost pisma
subor_odkial - subor kde mas ulozene odkazy
>  - presmeruj do suboru
subor_kam.txt  - cesta a nazov suboru kam to chces
Název: Re: "Vytípání" textu z dokumentu
Přispěvatel: Kaktus 03 Května 2011, 20:35:16
TIBOR:
Děkuji za tip, ale pokud bych to dělal takto, tak bych musel vždy jednotlivě zadat název, který chci "vytípat" a pokud jich mám desítky, musel bych to provést pro každý název zvlášť. Je to ale krok dopředu - někdo jiný by mohl vědět, jak tomu kódu říci, aby sám vyhledal stejné názvy ve zdrojovém dokumentu. Možná by to bylo něco jako toto "prohledej soubor, a pokud tam najdeš ve dvou řádcích stejný název (v našem případě nazdar a ahoj), vytvoř s tímto názvem soubor a do něj nakopíruj řádky, které tento název obsahují".
Název: Re: "Vytípání" textu z dokumentu
Přispěvatel: Ivan Nolč 03 Května 2011, 22:49:35
Tady jsem to rychle udělal ve freepascalu.
Zkompilováno pro 32 bitový linux.
Kód: [Vybrat]
http://upload.eunuch.cz/files/program.zipSeznam souborů zkopírovat do souboru vstup.txt a seřadit podle abecedy treba v geditU pak spustit program.

Kód: [Vybrat]
program program10;
uses crt, dos;
var fin, fout : text;
    s : string;
begin
clrscr;
assign(fin, 'vstup.txt');
reset(fin);
repeat
readln(fin, s);
if pos('rapidshare.com',s) <> 0 then
        begin
            if pos('.part',s) <> 0 then Assign(fout, Copy(s, 39, -39 + pos('.part',s))+'.txt') else Assign(fout, Copy(s, 39, -39 + pos('.rar',s))+'.txt');
            {$I-}
            Append(fout);
            {$+}
            if (ioresult <> 0) then rewrite(fout);
            Writeln(fout, s);
            close(fout);
            writeln(s);
        end;
until eof(fin);
close(fin);

Readkey;
end.
Název: Re: "Vytípání" textu z dokumentu
Přispěvatel: pacholik 03 Května 2011, 22:55:42
Kód: [Vybrat]
sed -r -e s#^.*/## -e s#.part[0-9]+.rar## soubor | sort -u | while read i; do (grep $i soubor > $i); done
Název: Re: "Vytípání" textu z dokumentu
Přispěvatel: Kaktus 05 Května 2011, 21:18:31
Tak nejvíce se mi líbí řešení pacholíka (je to jenom v řádku), ale hlavně - funguje to jako víno. Toho bych rád využil a zeptal bych se ještě navíc, jestli to lze nějak upravit pro použití, pokud by textem byly IP adresy v logu? Ideálně aby to udělalo toto "najdi v logu všechny IP adresy, podle IP adresy pojmenuj soubor a do něj za každý výskyt onu IP zapiš". Pokud bych tedy měl příklad souboru obsahujícího
Kód: [Vybrat]
aa 1.1.1.1 bb
kdesi 1.1.1.1 cosi
lopata 2.2.2.2 krumpáč
2.2.2.2 hever klíč
řízek maso 2.2.2.2
virus 3.3.3.3 pius

pak bych chtěl, aby mi to udělalo soubory 1.1.1.1 (a v něm 2x 1.1.1.1 v řádcích), 2.2.2.2 (a v něm 3x 2.2.2.2 v řádcích)  , 3.3.3.3 (a v něm 1x 3.3.3.3).

Já to dělám postupně takto
1) nejdříve si vypíši adresy grep -Eo '[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' zdroj > vystup
2) pak si dam sort vystup > vystup2
3) a nakonec si vystup2 otevřu v textovém editoru, kde si podle počtu řádku dopočítám, kolikrát ta IP v logu je :-)

šlo by to pomocí příkazu sed zařídit tak, jak je to výše popsáno? Asi by mi to usnadnilo dohled, když bych již podle velikosti souboru poznal, která IP je tam nejvíce a která nejméně.
Název: Re: "Vytípání" textu z dokumentu
Přispěvatel: pacholik 05 Května 2011, 22:29:34
Proč sed, na tohle se krásně hodí grep, ten co máš netřeba měnit.
Nebylo by lepší kdyby ti to rovnou spočítalo kolik tam těch adres máš ?
Kód: [Vybrat]
grep -Eo '[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' soubor | sort -u | while read i; do printf "$i\t`grep $i soubor | wc -l`×\n"; done
Název: Re: "Vytípání" textu z dokumentu
Přispěvatel: Kaktus 06 Května 2011, 18:33:21
Tak to nemá chybu - výsledek ještě seřadit podle výskytu
Kód: [Vybrat]
sort -n -k 2,2 souborsIP > souborsIPpodlevyskytu
a je to ještě lepší.

Za oba kódy Ti velmi děkuji!