Rozdělování řádků podle začátku

host

Rozdělování řádků podle začátku
« kdy: 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
« Poslední změna: 19. 08. 2013, 11:05:42 od Petr Krčmář »


Re:Rozdělování řádků podle začátku
« Odpověď #1 kdy: 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

Sten

Re:Rozdělování řádků podle začátku
« Odpověď #2 kdy: 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" =~ ^- ]]

Re:Rozdělování řádků podle začátku
« Odpověď #3 kdy: 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]

Sten

Re:Rozdělování řádků podle začátku
« Odpověď #4 kdy: 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.


mkmm

Re:Rozdělování řádků podle začátku
« Odpověď #5 kdy: 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.

gamer

Re:Rozdělování řádků podle začátku
« Odpověď #6 kdy: 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

Re:Rozdělování řádků podle začátku
« Odpověď #7 kdy: 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 ...

Re:Rozdělování řádků podle začátku
« Odpověď #8 kdy: 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.

gamer

Re:Rozdělování řádků podle začátku
« Odpověď #9 kdy: 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.

mkmm

Re:Rozdělování řádků podle začátku
« Odpověď #10 kdy: 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.

gamer

Re:Rozdělování řádků podle začátku
« Odpověď #11 kdy: 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í :) ).

mkmm

Re:Rozdělování řádků podle začátku
« Odpověď #12 kdy: 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.

Avogadrus

Re:Rozdělování řádků podle začátku
« Odpověď #13 kdy: 19. 08. 2013, 13:59:43 »
Nezapomínat na awk.

Kód: [Vybrat]
awk ' { if ( $0 ~ /^-/ ) { print $0 } else { print "rum" } } ' /temp/soubor

Franta <xkucf03/>

Re:Rozdělování řádků podle začátku
« Odpověď #14 kdy: 19. 08. 2013, 14:25:06 »
Případně bych zkusil Perl:

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

:-)