Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Problém se sedem [vyřešeno]  (Přečteno 4173 krát)

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 224
Problém se sedem [vyřešeno]
« kdy: 23 Září 2011, 22:48:34 »
Zdravim,
behem prace se sedem (http://cs.wikipedia.org/wiki/Sed) jsem narazil na (pro me) pomerne zavazny problem, s jehoz resenim si nevim rady...
Vec se ma takto:
Formatuji text a z "technickych duvodu" mi vzdy jeden udaj konci ;, cimz skonci i radka. Muj problem ale je, ze bych k teto radce potreboval pripojit tu nasledujici, cili sloucit tyto dve radky do jedne.
Na strance http://sed.sourceforge.net/sed1line_cz.html jsem nasel tento prikaz
Kód: [Vybrat]
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D', ktery ale nefunguje (ta pripojovana radka skutecne take zacina znakem =), jak bych potreboval - spojuje radky pouze pokud jej spustim v terminalu
Kód: [Vybrat]
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' /home/user/Plocha/NEWS/Vystup/*, kde se mi potom zobrazi korektne upraveny text. JENZE - pokud ten prikaz zapisu do skriptu, prislusne soubory (ve slozce Vystup) se NEUPRAVI. Predpokladam, ze je to kvuli prepinaci -e. Bohuzel se mi ale nedari ho uspesne nahradit prepinacem -i. Nezna nekdo reseni? Potrebuji, aby sed kazdy ze souboru ve Vystupu upravil samostatne, cili export pomoci prepinace -e (coz funguje) mi nepomuze, nebot by vytvoril pouze JEDEN vysledny soubor...
Predem dekuji za vase rady!
« Poslední změna: 25 Září 2011, 13:33:05 od Pavel Půlpán »

Kedrigern

Re: Problém se sedem
« Odpověď #1 kdy: 23 Září 2011, 23:35:53 »
Za chvíli se ti na to mrknu (doufám), ale bylo by dobré sem dát větší výsek kódu - nějaký samostatně funkční. A testovací data. Chyba se občas skrývá trochu bokem.

Kedrigern

Re: Problém se sedem
« Odpověď #2 kdy: 24 Září 2011, 00:12:07 »
Funguje:
Citace
sed '$!N;s/\n//' a.txt
mám to takto:
Citace
#!/bin/sh

sed '$!N;s/\n//' a.txt
kde a.txt:
Citace
udaj1;
=udaj2
udaj3;
=udaj4
a dostanu:
Citace
keddie@musa:~/src/bash$ ./s.sh
udaj1;=udaj2
udaj3;=udaj4

Mimochodem znamená to:
$ -poslední řádka
! -pokud neplatí adresa řádky vykonej
N - je načten nový řádek (tedy ten další)
Čili: Pokud nejsi na posledním řádku, tak načti další řádku, substituj konec (s/\n//). Následně se naše spojená řádka vypíše. Jednou načtená řádka se už pak neobjeví na vstupu sedu.

Jediný problém je pokud se řádky pravidelně nestřídají.
« Poslední změna: 24 Září 2011, 00:19:22 od Kedrigern »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: Problém se sedem
« Odpověď #3 kdy: 24 Září 2011, 01:55:45 »
No ten příkaz, co jsi našel, máš vpořádku, jen místo přepínačů -e, použiješ středníky:

Kód: [Vybrat]
sed -i ':a; $!N; s/\n=/ /; ta; P; D' /home/user/Plocha/NEWS/Vystup/*
:a je label, a ta je skok na label :a (začátek příkazu), pokud proběhla substituce, což zajistí, aby se substituce vykonala na dvouřádcích, které nenásledují přímo za sebou, jak zmínil Kedrigern. Příkazy P a D zas přidáním a opětovným smazáním řádky zajistí, aby se substituce provedla i na dvouřádcích následujících přímo za sebou, čemuž naopak předchozí podmíněný skok brání. Snad jsem to už napsal správně :)

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 224
Re: Problém se sedem
« Odpověď #4 kdy: 24 Září 2011, 15:20:03 »
Diky moc chlapi, jeste dneska to vyzkousim. Muj kod je nasledujici:

Zdroj:
Kód: [Vybrat]
#STA:000000,511;L:278;TM:23/09/2011,00:05:02;D:5;T:01;C:18;A00:00000;A01:00000;A02:00000;A03:00000;A04:00000;A05:00000;A06:00000;A07:12.25;
#STA:000000,511;L:278;TM:23/09/2011,00:10:01;D:5;T:01;C:19;A00:00000;A01:00000;A02:00000;A03:00000;A04:00000;A05:00000;A06:00000;A07:12.18;
STA:000000;A08:00000;A09:42.06;A10:36.62;A11:41.18;A12:42.25;A13:-0.06;A14:15.25;P01:00000000;P02:00000000;P03:00000000;K01:13330000000000000;O01:0000;08#
#STA:000000,511;L:278;TM:23/09/2011,00:15:00;D:5;T:01;C:20;A00:00000;A01:00000;A02:00000;A03:00000;A04:00000;A05:00000;A06:00000;A07:12.18;
STA:000000;A08:00000;A09:41.93;A10:39.25;A11:43.50;A12:42.25;A13:-0.06;A14:15.12;P01:00000000;P02:00000000;P03:00000000;K01:13330000000000000;O01:0000;05#
#STA:000000,511;L:278;TM:23/09/2011,00:20:01;D:5;T:01;C:21;A00:00000;A01:00000;A02:00000;A03:00000;A04:00000;A05:00000;A06:00000;A07:12.06;
STA:000000;A08:00000;A09:41.18;A10:41.62;A11:38.12;A12:42.18;A13:-0.06;A14:15.00;P01:00000000;P02:00000000;P03:00000000;K01:13330000000000000;O01:0000;F8#
#STA:000000,511;L:278;TM:23/09/2011,00:25:01;D:5;T:01;C:22;A00:00000;A01:00000;A02:00000;A03:00000;A04:00000;A05:00000;A06:00000;A07:12.06;
STA:000000;A08:00000;A09:41.12;A10:40.62;A11:40.93;A12:42.12;A13:-0.06;A14:15.00;P01:00000000;P02:00000000;P03:00000000;K01:13330000000000000;O01:0000;F3#
#STA:000000,511;L:278;TM:23/09/2011,00:30:00;D:5;T:01;C:23;A00:00000;A01:00000;A02:00000;A03:00000;A04:00000;A05:00000;A06:00000;A07:11.87;
STA:000000;A08:00000;A09:41.06;A10:39.12;A11:36.81;A12:42.00;A13:-0.06;A14:14.87;P01:00000000;P02:00000000;P03:00000000;K01:13330000000000000;O01:0000;0A#
#STA:000000,511;L:278;TM:23/09/2011,00:35:01;D:5;T:01;C:24;A00:00000;A01:00000;A02:00000;A03:00000;A04:00000;A05:00000;A06:00000;A07:11.62;
Upravy sedem potom ridi nasledujici skript:
Kód: [Vybrat]
#!/bin/bash
# Skript k interpretaci, serazeni a formatovani textovych reportu z GSMS-THV Data Loggeru

# Kopirovani vsech souboru ve slozce do jine slozky
cp /home/user/Plocha/NEW/Vstup/* /home/user/Plocha/NEWS/Vystup/

# Kopirovani vsech souboru ve slozce do jine slozky
cp /home/user/Plocha/NEWS/Vstup/* /home/user/Plocha/NEWS/Vystup/
# '*' = vsechny soubory;
# za '.../Vystup/' nechat prazde = do adresare

# Uprava VSECH souboru ve slozce ("online", bez vytvareni novych souboru) pomoci sedovych parametru v souboru .sed
# 1. Interpret
sed -i -f '/home/user/Plocha/NEWS/Interpret.sed' /home/user/Plocha/NEWS/Vystup/*

# 2. Stylista 1 (NEFUNKCNI !!!)
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' /home/user/Plocha/NEWS/Vystup/*

Sedovy soubor Interpret je nasledujici:
Kód: [Vybrat]
s/#STA:000000,/ /
s/;L:/ /
s/;TM:/ /
s/;D:/; Reporting interval: /
s/; Reporting interval: 1;/ 5 min;/
s/; Reporting interval: 2;/ 15 min;/
s/; Reporting interval: 3;/ 30 min;/
s/; Reporting interval: 4;/ 60 min;/
s/; Reporting interval: 5;/ 1 min;/
s/;T:/ /
s/;C:/ /
s/;A00:/ /
s/;A01:/ /
s/;A02:/ /
s/;A03:/ /
s/;A04:/ /
s/;A05:/ /
s/;A06:/ /
s/;A07:/ /
s/STA:000000;A08:/= /
s/;A09:/ /
s/;A10:/ /
s/;A11:/ /
s/;A12:/ /
s/;A13:/ /
s/;A14:/ /
s/;P01:/ /
s/;P02:/ /
s/;P03:/ /
s/;K01:/ /
s/;O01:/ /
s/;1/ 1/
s/;2/ 2/
s/;3/ 3/
s/;4/ 4/
s/;5/ 5/
s/;6/ 6/
s/;7/ 7/
s/;8/ 8/
s/;9/ 9/
s/;0/ 0/
s/#/\n/
Na zacatek souboru se potom bude vpisovat obsah souboru Header txt.
Kód: [Vybrat]
Device number Number of characters in packet Time of statement Reporting interval Records in packet Uploaded packets Humidity Sensor A01 Sensor A02 Sensor A03 Sensor A04 Sensor A05 Sensor A06 Sensor A07 Sensor A08 Sensor A09 Sensor A10 Sensor A11 Sensor A12 Sensor A13 Sensor A14 Sensor P01 Sensor P02 Sensor P03 Device status (to zatim nemam osetrene) Tim by se mi ta data mela dostat do formatu, kdy vysledny (vysledne) textovy soubor(y) stylem Drag & Drop pretahnu do Calcu a vsechna data ze stejneho senzoru budu mit v jednom sloupci pod sebou a zaroven te sloupec bude nahore pojemnovat podle prisl. senzoru.
Jeste jednou diky za pomoc, dam vedet jak vase rady zafungovaly! :)
PS: Puvodne jsem to formatoval jinak, kdyby nekoho zajimal vyvoj a/nebo chybely informace, muzete se kouknout na http://forum.ubuntu.cz/index.php/topic,58085.msg418564.html#msg418564

EDIT: Tak jsem hned vyzkousel tu verzi od GdH (prave kvuli nepravidelnosti tech radku) a musim znovu podekovat, funguje bez problemu. Takze uz jen doresim to vpisovani obsahu Header.txt na zacatek kazdeho souboru (radu uvitam :) ) a mam hotovo :)
« Poslední změna: 24 Září 2011, 16:10:14 od Václav Sobota »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: Problém se sedem
« Odpověď #5 kdy: 24 Září 2011, 16:52:01 »
Vložení prvního řádku např.:

Kód: [Vybrat]
sed -i "1 i `cat Header.txt`" soubor
Důležité jsou tu ty dvojité uvozovky, aby se expandoval příkaz cat, a pak aby soubor Header.txt měl jediný řádek.

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 224
Re: Problém se sedem
« Odpověď #6 kdy: 24 Září 2011, 19:52:23 »
Diky moc, funguje to vyborne! Jenze s jidlem roste chut a tak se te z dovolenim zeptam jeste na jednu malickost...
Chtel bych alespon castecne zautomatizovat ten export do Calcu, tak jsem napsal tenhle prikaz:
Kód: [Vybrat]
ooffice -calc "/home/user/Plocha/TEST/`ls /home/user/Plocha/TEST/`"Bohuzel ale otevre vzdycky jenom prvni soubor v te slozce, druhy uz hleda v /home/user/, nevedel by sis s tim rady, jak "zafixovat" tu cestu /home/user/Plocha/TEST/?

pacholik

  • Závislák
  • ***
  • Příspěvků: 2072
Re: Problém se sedem
« Odpověď #7 kdy: 24 Září 2011, 21:38:50 »
stačí
Kód: [Vybrat]
ooffice -calc /home/user/Plocha/TEST/*

Kedrigern

Re: Problém se sedem
« Odpověď #8 kdy: 24 Září 2011, 22:57:20 »
Mimochodem problém s tvým `ls` byl, že ls to vypíše po řádcích, pokud nepíše přímo na terminál. Je to z toho důvodu, aby fungovalo např.:  ls | sed -n '1p'. Zapomněl jsem jak se tomu říká... něco jako interaktivní a neinteraktivní mód.

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 224
Re: Problém se sedem
« Odpověď #9 kdy: 24 Září 2011, 23:12:27 »
stačí
Kód: [Vybrat]
ooffice -calc /home/user/Plocha/TEST/*

Tak tohle je samozrejme to prvni, co jsem zkousel. Bohuzel to z nejakeho duvodu nefunguje. :(

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 224
Re: Problém se sedem
« Odpověď #10 kdy: 24 Září 2011, 23:15:37 »
Mimochodem problém s tvým `ls` byl, že ls to vypíše po řádcích, pokud nepíše přímo na terminál. Je to z toho důvodu, aby fungovalo např.:  ls | sed -n '1p'. Zapomněl jsem jak se tomu říká... něco jako interaktivní a neinteraktivní mód.

Taky mi to doslo, ale presto porad nejak nevim.. Napadlo me pouzit te tvuj prikaz a opakovat ho az rekneme do 'p200', ale zda se mi to dost kostrbate...

Kedrigern

Re: Problém se sedem
« Odpověď #11 kdy: 24 Září 2011, 23:59:22 »
Ehm, možná hloupě, ale... a umí calc otevírat více souborů? Res. zpracovávat je takto. Zkoušel si to třeba na dvou ručně zadaných? Ta hvězdička udělá jen to, že to narve jako parametry příkazu, program to podporovat nemusí.

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: Problém se sedem
« Odpověď #12 kdy: 25 Září 2011, 00:21:56 »
Kód: [Vybrat]
find /home/user/Plocha/TEST/ -exec ooffice -calc "{}" \;
Kód: [Vybrat]
find /home/user/Plocha/TEST/ -exec oocalc "{}" \;
« Poslední změna: 25 Září 2011, 00:25:27 od GdH »

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 224
Re: Problém se sedem
« Odpověď #13 kdy: 25 Září 2011, 03:00:34 »
Ehm, možná hloupě, ale... a umí calc otevírat více souborů? Res. zpracovávat je takto. Zkoušel si to třeba na dvou ručně zadaných? Ta hvězdička udělá jen to, že to narve jako parametry příkazu, program to podporovat nemusí.
Otevirat vice souboru umi, prave tak jak rikas (rucne) jsem to vyzkousel. A asi mas pravdu v tom, ze nepodporuje tu * - podle toho, co hlasi bych rekl (jsem si tim celkem jisty), povazuje ji za nazev souboru.

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 224
Re: Problém se sedem
« Odpověď #14 kdy: 25 Září 2011, 03:01:34 »
Kód: [Vybrat]
find /home/user/Plocha/TEST/ -exec ooffice -calc "{}" \;
Kód: [Vybrat]
find /home/user/Plocha/TEST/ -exec oocalc "{}" \;

Ta prvni syntaxe funguje perfektne :) Diky moc, pisu VYRESENO :)

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: Problém se sedem
« Odpověď #15 kdy: 25 Září 2011, 07:53:43 »
Ehm, možná hloupě, ale... a umí calc otevírat více souborů? Res. zpracovávat je takto. Zkoušel si to třeba na dvou ručně zadaných? Ta hvězdička udělá jen to, že to narve jako parametry příkazu, program to podporovat nemusí.
Otevirat vice souboru umi, prave tak jak rikas (rucne) jsem to vyzkousel. A asi mas pravdu v tom, ze nepodporuje tu * - podle toho, co hlasi bych rekl (jsem si tim celkem jisty), povazuje ji za nazev souboru.

To není o tom, zda ooffice umí hvězdičku, neboť tu interpretuje shell a ooffice dostane výsledek. Příkaz, který jsem ti napsal ale otevírá ty soubory jeden po druhém, v tom je ten rozdíl. Vzhledem k tomu, že ooffice skutečně umí otevřít více souborů na jeden zátah, nevidím důvod, proč by neměla fungovat ona jednoduchá varianta s hvězdičkou (mně funguje). Ostatně pokud můj předchozí příkaz pozměníš, udělá to samé, jako pacholikuv příkaz (krom toho, že najde i skryté soubory):

Kód: [Vybrat]
find /home/user/Plocha/TEST/ -exec ooffice -calc "{}" \+
« Poslední změna: 25 Září 2011, 08:14:46 od GdH »

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 224
Re: Problém se sedem
« Odpověď #16 kdy: 25 Září 2011, 15:20:32 »
Ehm, možná hloupě, ale... a umí calc otevírat více souborů? Res. zpracovávat je takto. Zkoušel si to třeba na dvou ručně zadaných? Ta hvězdička udělá jen to, že to narve jako parametry příkazu, program to podporovat nemusí.
Otevirat vice souboru umi, prave tak jak rikas (rucne) jsem to vyzkousel. A asi mas pravdu v tom, ze nepodporuje tu * - podle toho, co hlasi bych rekl (jsem si tim celkem jisty), povazuje ji za nazev souboru.

To není o tom, zda ooffice umí hvězdičku, neboť tu interpretuje shell a ooffice dostane výsledek. Příkaz, který jsem ti napsal ale otevírá ty soubory jeden po druhém, v tom je ten rozdíl. Vzhledem k tomu, že ooffice skutečně umí otevřít více souborů na jeden zátah, nevidím důvod, proč by neměla fungovat ona jednoduchá varianta s hvězdičkou (mně funguje). Ostatně pokud můj předchozí příkaz pozměníš, udělá to samé, jako pacholikuv příkaz (krom toho, že najde i skryté soubory):

Kód: [Vybrat]
find /home/user/Plocha/TEST/ -exec ooffice -calc "{}" \+


To mas zcela urcite pravdu, uprimne receno vubec netusim, proc v tomhle pripade nefunguje *. Ale mam Mavericka a neni to poprve, co shell nefunguje, jak by se dalo ocekavat...

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: Problém se sedem
« Odpověď #17 kdy: 25 Září 2011, 16:00:22 »
To mas zcela urcite pravdu, uprimne receno vubec netusim, proc v tomhle pripade nefunguje *. Ale mam Mavericka a neni to poprve, co shell nefunguje, jak by se dalo ocekavat...

Shell většinou funguje tak, jak se dá očekávat, problémy nejčastěji vznikají tehdy, když nevíme co očekávat a očekáváme něco jiného :) Mimochodem mám taky Mavericka. Zkoušel jsi ten upravený příkaz z mého předchozího příspěvku?

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 224
Re: Problém se sedem [vyřešeno]
« Odpověď #18 kdy: 25 Září 2011, 17:32:27 »
To mas zcela urcite pravdu, uprimne receno vubec netusim, proc v tomhle pripade nefunguje *. Ale mam Mavericka a neni to poprve, co shell nefunguje, jak by se dalo ocekavat...

Shell většinou funguje tak, jak se dá očekávat, problémy nejčastěji vznikají tehdy, když nevíme co očekávat a očekáváme něco jiného :) Mimochodem mám taky Mavericka. Zkoušel jsi ten upravený příkaz z mého předchozího příspěvku?

Zkousel :) Taktez funguje zcela bez problemu. Jenom ta hvezdicka ne, Calc vzdycky zahlasi ze "Soubor .../* neexistuje"...

Mimochodem, vyzkousel jsem, ze pri prepsani koncovky z txt na xls soubor normalne funguje (stejne, jako kdybys Calcem otviral txt, ale neni treba ho potom uz ukladat jinak, coz by pro me byla velka vyhoda). Nasel jsem kod
Kód: [Vybrat]
for file in /home/user/Plocha/NEWS/Vystup/*.txt ; do mv $file `echo $file | sed 's/\(.*\.\)txt/\1xls/'` ; done ale kdyz ho pouziji, vzdycky mi odpovi mv: cíl „1-47.xls“ není adresářem... Takze si rikam ze to budem jenom malej hacek, ale nejak na nej nemuzu prijit :(
« Poslední změna: 25 Září 2011, 17:46:20 od Václav Sobota »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: Problém se sedem [vyřešeno]
« Odpověď #19 kdy: 25 Září 2011, 19:23:41 »
V příkazu chybu nevidím, funguje jak má. Zkus si jen nechat vypsat ten seznam, jestli je vpořádku:

Kód: [Vybrat]
for file in /home/user/Plocha/NEWS/Vystup/*.txt; do echo $file; done
případně ten výstup ukaž.

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 224
Re: Problém se sedem [vyřešeno]
« Odpověď #20 kdy: 25 Září 2011, 19:30:46 »
V příkazu chybu nevidím, funguje jak má. Zkus si jen nechat vypsat ten seznam, jestli je vpořádku:

Kód: [Vybrat]
for file in /home/user/Plocha/NEWS/Vystup/*.txt; do echo $file; done
případně ten výstup ukaž.
Tak vystup asi v poradku bude:
Kód: [Vybrat]
/home/user/Plocha/NEWS/Vystup/Datalogger_report.txt
/home/user/Plocha/NEWS/Vystup/Mensajes 1-47.txt
:( Jinak ten prikaz byl v originale
Kód: [Vybrat]
for file in *.htm ; do mv $file `echo $file | sed 's/\(.*\.\)htm/\1html/'` ; done

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: Problém se sedem [vyřešeno]
« Odpověď #21 kdy: 25 Září 2011, 19:35:27 »
Jasan, mezera. Zkus to takhle:

Kód: [Vybrat]
for file in /home/user/Plocha/NEWS/Vystup/*.txt ; do mv "$file" "`echo $file | sed 's/\(.*\.\)txt/\1xls/'`" ; done

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 224
Re: Problém se sedem [vyřešeno]
« Odpověď #22 kdy: 25 Září 2011, 19:41:06 »
Zase mas pravdu, ted uz to funguje. Diky moc, snad se s bashem taky brzo neco naucim :D
Jeste jednou diky

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: Problém se sedem [vyřešeno]
« Odpověď #23 kdy: 25 Září 2011, 20:09:33 »
Zase mas pravdu, ted uz to funguje. Diky moc, snad se s bashem taky brzo neco naucim :D
Jeste jednou diky

Rádo se stalo. Pevné nervy při studiu, operování v BASHi může být náročné, než pochopíš některé zákonitosti :)
Například v tomto seriálu jsem pár zajímavých věcí našel:
http://www.linuxexpres.cz/praxe/serial-o-bashi
« Poslední změna: 25 Září 2011, 21:21:47 od GdH »

 

Provoz zaštiťuje spolek OpenAlt.