Fórum Root.cz
Hlavní témata => Software => Téma založeno: scientific 16. 08. 2020, 00:20:17
-
Ahoj všem, prosím o banální radu.
Potřebuji poradit, jak upravovat řádky v souborech, jak potřebuji, viz příklad níže. Je mi jedno, jestli to bude sed, awk, tr, nebo co já vím. :-)
Mám soubor s řádky:
- jmeno:Michal;neco neco2 neco3;prijmeni:Novak
- jmeno:Marta;neco;prijmeni:nesladkova
- ...
- jmeno:Marek;neco neco2 neco3;prijmeni:Stastny
Chtěl bych výstup takto (odstranění nezajímavého balastu mezi dvěma slovy/stríngy/znaky (v našem případě znak středník z obou stran)):
- jmeno:Michal;;prijmeni:Novak
- jmeno:Marta;;prijmeni:nesladkova
- ...
- jmeno:Marek;;prijmeni:Stastny
Děkuji všem.
-
treba
cat file |cut -d ';' -f 1,3 | sed s/\;/\;\;/
-
děkuji ti, cut chápu, sed nechápu, můžeš mi trochu popsal, jak funguje?
Nicméně si myslím, že toto řešení mi nepomůže, cut vychází z toho, že v samotném balastu už středník být nemůže, ale on tam být může.
Potřebuji spíš něco jako: cut -d ';' -f fist,last
Prostě neupínat se na ten tvar balastu, tím balastem může být úplně cokoliv, klidně 10 středníků :-D
-
awk -F ";" '{print $1";;"$NF}' file
-
Nebo sedem:
sed 's/^\(jmeno:[^;]*;\).*\(;prijmeni:.*\)$/\1\2/'
Omezení:
- oddělovač (středník) je znak, ne string
- string ";prijmeni:" se nesmí vyskytovat v balastu
-
Mirek Prýmek: Nikde jsem napsal co je nebo není středník. Moc se fixuješ na data v mém příkladu. Zleva může být jméno, ale taky to může být adresa. :-D
listoper: Díky moc, tvoje řešení funguje dokonale. Paráda, díky moc. :-)
Děkuji i všem, co se snažili mi pomoci.
-
Pokud jde o CSV data, je také možnost spouštět přímo nad CSV daty SQL příkazy. Těch projektů, které to umožňují je víc (včetně některých databází, které podporují CSV jako storage), zkusil bych například command line utility q https://github.com/harelba/q (https://github.com/harelba/q) nebo csvsql https://csvkit.readthedocs.io/en/latest/scripts/csvsql.html (https://csvkit.readthedocs.io/en/latest/scripts/csvsql.html)
-
Mirek Prýmek: Nikde jsem napsal co je nebo není středník.
???
mezi dvěma slovy/stríngy/znaky (v našem případě znak středník z obou stran)
----
Pokud tam misto "jmeno" chces "bambule", tak si tam v tom vyrazu napises "bambule". Jestli misto stredniku chces zavinac, tak si tam napises zavinac. Nechapu pointu tve vyhrady.
-
Mirek Prýmek: Nikde jsem napsal co je nebo není středník. Moc se fixuješ na data v mém příkladu. Zleva může být jméno, ale taky to může být adresa. :-D
listoper: Díky moc, tvoje řešení funguje dokonale. Paráda, díky moc. :-)
Děkuji i všem, co se snažili mi pomoci.
nalevo pouzit nongreedy match
perl -pe 's/(.*?;).*(;.*)/$1$2/'
oddelovac muze byt i viceznakove slovo
perl -pe 's/(.*?slovo).*(slovo.*)/$1$2/'
doporucuji pouzivat perl jako nahradu sedu, dialekt regexu v sedu je v dnesni dobe dost nestandardni
-
doporucuji pouzivat perl jako nahradu sedu, dialekt regexu v sedu je v dnesni dobe dost nestandardni
Což v tomhle případě nehraje žádnou roli, protože nejprimitivnější regex udělá přesně to co má.
sed 's/;.*;/;;/'
-
Což v tomhle případě nehraje žádnou roli, protože nejprimitivnější regex udělá přesně to co má.
sed 's/;.*;/;;/'
Pěkně! :thumbsup:
-
doporucuji pouzivat perl jako nahradu sedu, dialekt regexu v sedu je v dnesni dobe dost nestandardni
Což v tomhle případě nehraje žádnou roli, protože nejprimitivnější regex udělá přesně to co má.
sed 's/;.*;/;;/'
pravda, ale pokud je oddelovac delsi slovo, musite ho opakovat v nahrade.
-
sed 's/;.*;/;;/'
pravda, ale pokud je oddelovac delsi slovo, musite ho opakovat v nahrade.
Zde je oddělovačem středník, který kupodivu vypadá jako středník a je prezentován jedním znakem.