Portál AbcLinuxu, 8. května 2025 23:00
&nazev_tabulky;prvni_polozka;druha_polozka;..;.....;.......;nta_plozkapricemz textovy polozky muzou obsahovat konec radky, pak ale nasledujici radek nezacina ampresandem a ten radek predtim konci paznakem "¤". No a ja potrebuju vytahat radky, ktery patreji k jedne tabulce. Delal sem to pomoc grep ^\&tbl; ale to prave zahodilo pokracovani zaznamu po \n. No vim, ye to je trivka, ale neumim ten sed temer pouzivat, awk vubec. Byl bych vdecnej za nejaky nakopnuti do zacatku (myslim to obrazne).
Řešení dotazu:
awk
, bez kontroly čekohokoliv (mimochodem třeba výskytu ampersantu na začátku řádku, i když se nejedná o pokračování předchozího záznamu... což samozřejmě také lze ;), taky to neřeší předchozí existenci souborů a já nevím co, prostě jenom kousek v awk
, co to rozseká), pokud správně chápu Váš vstup a to, co chcete, aby z toho vypadlo, třeba takto:
/usr/bin/awk -F';' ' /^&/ { filename=$1 sub(/^&/,"",filename) } { print >> filename } ' /cesta/k/vasemu/souboruProstě při každém průchodu, když řádek začne
&
, tak se položka do prvního středníku bez &
uloží do proměnné filename
. Každý řádek se přidá do souboru s aktuálním jménem filename
.
grep ^\B 3212.vfk | sed 's/^\&[BD]\([A-Z]*\).*/grep ^\\\&[BD]\1\\\; 3212.vfk > ..\/parts\/\1_3212.vfk/' | bashAle to ten soubor prochází hodněkrát a navíc neumim udělat, aby to vzalo celej záznam i pokud obsahuje konec řádky. např:
&nejaka_tabulka;polozka;polozka;polozka¤ na¤ hodne¤ radku;polozka;polozkaz takovýho záznamu mě to veme jen ten první řádek. Řešení, který bych použil já by asi zahrnovalo \n¤ v regexp, protože regexp sem zvyklej používat, ale mam za to, že to musí jít udělat nějak jednodušejc a potřeboval bych nakopnout správným směrem. Nepotřebuju, aby za mě někdo dělal domácí úkoly...
$ cat s
&jina_tabulka;polozka;polozka;polozka3;polozka;polozka¤
polozka
&nejaka_tabulka;polozka;polozka;polozka¤
na¤
hodne¤
radku;polozka;polozka
&nejaka_tabulka;polozka;polozka;polozka¤
2;polozka;polozka
&jina_tabulka;polozka;polozka;polozka3;polozka;polozka
&nejaka_tabulka;polozka;polozka;polozka3;polozka;polozka
$ rm -f nejaka_tabulka jina_tabulka
$ gawk 'BEGIN {RS = "[^¤]\n"; ORS = ""; FS = ";"} /^&/{file=$1; sub(/^&/,"",file); print $0 RT >> file}' < s
$ cat nejaka_tabulka
&nejaka_tabulka;polozka;polozka;polozka¤
na¤
hodne¤
radku;polozka;polozka
&nejaka_tabulka;polozka;polozka;polozka¤
2;polozka;polozka
&nejaka_tabulka;polozka;polozka;polozka3;polozka;polozka
$ cat jina_tabulka
&jina_tabulka;polozka;polozka;polozka3;polozka;polozka¤
polozka
&jina_tabulka;polozka;polozka;polozka3;polozka;polozka
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.