Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: host 19. 08. 2013, 10:41:23

Název: Rozdělování řádků podle začátku
Přispěvatel: host 19. 08. 2013, 10:41:23
Dobrý den,
řeším problém kdy potřebuji v cyklu přečíst txt soubor a při čtení řádků uvnitř cyklu rozdělovat tyto řádky na řádky začínající pomlčkou a žádky nezačínající pomlčkou. Napadlo mě udělat nějaký if který by to řešil a dát mu nějaký regulární výraz. Mé pokusy skončily neúspěchem...

Kód: [Vybrat]
for i in $(cat pokus.txt)
do
    if [[ "$i" =~ '^[-]' ]]; then
    echo $i
    fi
done

Mohli byste mi poradit jak na to?? Děkuji
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: hawran diskuse 19. 08. 2013, 11:11:11
Pokud chceš jen vybrat řádky začínající pomlčkou, tak by mělo stačit
Kód: [Vybrat]
egrep '^-' [soubor] > soubor.radky-s-pomlckou
Řádky nezačínající pomlčkou pak:
Kód: [Vybrat]
egrep -v '^-' [soubor] > soubor.radky-s-pomlckou
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: Sten 19. 08. 2013, 11:19:03
for i in $(cat pokus.txt) nečte řádky, ale slova. Řádky čte cat pokus.txt | while read i.

Druhý problém je, že ten regulární výraz se neuzavírá do uvozovek:[[ "$i" =~ ^- ]]
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: hawran diskuse 19. 08. 2013, 11:22:45
Pokud chceš jen vybrat řádky začínající pomlčkou, tak by mělo stačit
Kód: [Vybrat]
egrep '^-' [soubor] > soubor.radky-s-pomlckou
Řádky nezačínající pomlčkou pak:
Kód: [Vybrat]
egrep -v '^-' [soubor] > soubor.radky-s-pomlckou

A pokud jsi s těma řádkama chtěl něco dělat, tak zkus třeba:
Kód: [Vybrat]
while read RADEK; do
  echo ${RADEK}|egrep '^-' 1>/dev/null && {
    # radek s pomlckou na zacatku
    ...
  } || {
    # radek bez pomlcky na zacatku
    ...
  }
done < [soubor]
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: Sten 19. 08. 2013, 11:28:30
A pokud jsi s těma řádkama chtěl něco dělat, tak zkus třeba:
Kód: [Vybrat]
while read RADEK; do
  echo ${RADEK}|egrep '^-' 1>/dev/null && {
    # radek s pomlckou na zacatku
    ...
  } || {
    # radek bez pomlcky na zacatku
    ...
  }
done < [soubor]

egrep má parametr -q, aby se nemusel přesměrovávat do /dev/null.

A potom je tam jeden potenciální zdroj chyb, pokud poslední příkaz v prvním bloku („radek s pomlckou na zacatku“) vrátí chybu, provede se i druhý blok.
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: mkmm 19. 08. 2013, 11:36:39
Nebo bez toho egrepu:
Kód: [Vybrat]
#!/bin/bash
while read i; do
    if [[ $i == -* ]]; then
        echo "zacina pomlckou: $i"
    else
        echo "nezacina pomlckou: $i"
    fi
done < pokus.txt
Jestli chces jenom vypsat radky zacinajici pomlckou, staci sed -n '/^-/ p' pokus.txt.
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: gamer 19. 08. 2013, 11:41:50
Není jednodušší a přehlednější tohle, než všechny ty kryptické zápisy v bashi?
Kód: [Vybrat]
#!/usr/bin/env python
for line in open("pokus.txt"):
    if line.startswith("-"):
        print "Radek s pomlckou:", line
    else:
        print "Radek bez pomlcky:", line
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: hawran diskuse 19. 08. 2013, 11:44:17
...
egrep má parametr -q, aby se nemusel přesměrovávat do /dev/null.

A potom je tam jeden potenciální zdroj chyb, pokud poslední příkaz v prvním bloku („radek s pomlckou na zacatku“) vrátí chybu, provede se i druhý blok.

Mno, též jsem to mohl doplnit o test, zda existuje ten vstupní soubor a esli z něj jde číst.
Ale máš samozřejmě pravdu. Je to bez kontrol a to přesměrování do devnullu je tam jen proto, aby ho výpis nemátl, kdyby to zkoušel.
Prostě jen hrubý nástřel, detaily by si měl už doladit sám ...
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: hawran diskuse 19. 08. 2013, 11:46:39
Není jednodušší a přehlednější tohle, než všechny ty kryptické zápisy v bashi?
...

Ach jo.
Taky jsme mohli poradit něco v c++.
Nebo v brainfucku?

Tazatel začal ukázkou ve skriptu, tak se v tom dál pokračovalo, no.
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: gamer 19. 08. 2013, 11:52:37
Taky jsme mohli poradit něco v c++.
Nebo v brainfucku?

Tazatel začal ukázkou ve skriptu, tak se v tom dál pokračovalo, no.

Jen se snažím tazazeli naznačit, že si ušetří spoustu problémů, když na bash rychle zapomene a vybere si něco udržovatelnějšího ;). Jestli se tím bude řídit, je jen na něm.
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: mkmm 19. 08. 2013, 12:26:19
Jen se snažím tazazeli naznačit, že si ušetří spoustu problémů, když na bash rychle zapomene a vybere si něco udržovatelnějšího ;). Jestli se tím bude řídit, je jen na něm.
Je to samozrejme na nem, ale jestli se zabyva linuxem, tak si spis usetri hodne problemu, kdyz se ten bash nauci. IMHO shell a coreutils jsou zaklad. Jsou v kazdem unixu a krypticky se jevi jen tem, kteri je neznaji. Admini i programatori si ze zrejmych duvodu pisi svoje skripty v pythonu, perlu apod., ale bez znalosti tech zakladu by se stejne potykali s problemy.
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: gamer 19. 08. 2013, 12:34:27
Je to samozrejme na nem, ale jestli se zabyva linuxem, tak si spis usetri hodne problemu, kdyz se ten bash nauci. IMHO shell a coreutils jsou zaklad. Jsou v kazdem unixu a krypticky se jevi jen tem, kteri je neznaji. Admini i programatori si ze zrejmych duvodu pisi svoje skripty v pythonu, perlu apod., ale bez znalosti tech zakladu by se stejne potykali s problemy.

To je věc názoru, ale tohle téma na mě zatím působí tak, že bash na takové úrovni, aby v něm byl schopen napsat načtení souboru a otestování, že řádek začíná pomlčkou, zvládně bez chyb možná tak Sten a jinak nikdo. Což může znamenat, že všichni kromě Stena jsou blbci, nebo že je bash opravdu tak kryptický, že je lepší se mu vyhnout (nebo obojí :) ).
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: mkmm 19. 08. 2013, 13:16:41
To je věc názoru, ale tohle téma na mě zatím působí tak, že bash na takové úrovni, aby v něm byl schopen napsat načtení souboru a otestování, že řádek začíná pomlčkou, zvládně bez chyb možná tak Sten a jinak nikdo. Což může znamenat, že všichni kromě Stena jsou blbci, nebo že je bash opravdu tak kryptický, že je lepší se mu vyhnout (nebo obojí :) ).

Souhlasim, lidi se nauci nejake zaklady shellu, aby zvladli jednoduche skripty, a pak se vrhnou na nejaky mocnejsi jazyk. Studuji ho mnohem dukladneji a delaji v nem vetsinu prace. Asi ani nemaji chut se vracet k tomu shellu. Stazene tutorialy lezi nekde v adresari a cekaji, ze si je mozna jednou nekdo precte. Myslim, ze kdyby clovek venoval studiu shellu zlomek casu, ktery venuje treba pythonu, tak by nemel problem s vyse popsanym trivialnim ukolem. Jiste je to jen otazka pristupu, uzivatele to moc nepotrebuji a svoje skripty si nejak sepisou nebo vygoogli. Sam jsem psal nejake podle me super skripty v perlu a pak prisel zkuseny admin a zahanbil me resenim v shellu na jeden radek.
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: Avogadrus 19. 08. 2013, 13:59:43
Nezapomínat na awk.

Kód: [Vybrat]
awk ' { if ( $0 ~ /^-/ ) { print $0 } else { print "rum" } } ' /temp/soubor
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: Franta <xkucf03/> 19. 08. 2013, 14:25:06
Případně bych zkusil Perl:

cat vstup.txt | perl -ne 'if (/^-/) { print "S:   $_"; } else { print "BEZ: $_"; }'

:-)
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: gamer 19. 08. 2013, 16:46:36
Jestli je to soutěž, jak to napsat na jeden řádek a co nejvíc zatemnit, tak python v ničem nezaostává
Kód: [Vybrat]
print map(lambda x: "S pomlckou:" + x if x.startswith("-") else "Bez pomlcky:" + x, open("pokus.txt"))
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: Franta <xkucf03/> 19. 08. 2013, 17:43:25
Jestli to byla narážka na mě, tak ne – Perl mi přijde přehledný, jsou v něm normální závorky (ne jako v Pythonu) a dobře se tenhle zápis čte.
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: bwbw 19. 08. 2013, 23:05:20
for i in $(cat pokus.txt) nečte řádky, ale slova. Řádky čte cat pokus.txt | while read i.

Druhý problém je, že ten regulární výraz se neuzavírá do uvozovek:[[ "$i" =~ ^- ]]

teraz mam po ruke len osx, kde to funguje nasledovne:

IFS=$'\n' ; for i in `cat pokus.txt` ; do if echo ${i} | grep -q "^-" 2>/dev/null ; then echo S: ${i}; else echo BEZ: ${i} ; fi ; done
Název: Re:Rozdělování řádků podle začátku
Přispěvatel: ohlol 22. 08. 2013, 08:59:45
Jen se snažím tazazeli naznačit, že si ušetří spoustu problémů, když na bash rychle zapomene a vybere si něco udržovatelnějšího ;). Jestli se tím bude řídit, je jen na něm.
Je to samozrejme na nem, ale jestli se zabyva linuxem, tak si spis usetri hodne problemu, kdyz se ten bash nauci. IMHO shell a coreutils jsou zaklad. Jsou v kazdem unixu a krypticky se jevi jen tem, kteri je neznaji. Admini i programatori si ze zrejmych duvodu pisi svoje skripty v pythonu, perlu apod., ale bez znalosti tech zakladu by se stejne potykali s problemy.

... recnicka otazka zni jak dlouho jeste /trololo