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)
Citace od: scientific kdy 16. 08. 2020, 10:43:48
Mirek Prýmek: Nikde jsem napsal co je nebo není středník.
???
Citace od: scientific kdy 16. 08. 2020, 00:20:17
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.
Citace od: scientific kdy 16. 08. 2020, 10:43:48
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
Citace od: A.P.Hacker kdy 16. 08. 2020, 16:26:13
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/;.*;/;;/'
Citace od: tecka kdy 16. 08. 2020, 21:16:14
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:
Citace od: tecka kdy 16. 08. 2020, 21:16:14
Citace od: A.P.Hacker kdy 16. 08. 2020, 16:26:13
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.
Citace od: A.P.Hacker kdy 17. 08. 2020, 16:08:36
Citace od: tecka kdy 16. 08. 2020, 21:16:14
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.