Hrátky s textem

Hrátky s textem
« kdy: 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.




jouda2

Re:Hrátky s textem
« Odpověď #1 kdy: 16. 08. 2020, 00:56:29 »
treba
cat file |cut -d ';' -f 1,3 | sed s/\;/\;\;/

Re:Hrátky s textem
« Odpověď #2 kdy: 16. 08. 2020, 08:35:53 »
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

Re:Hrátky s textem
« Odpověď #3 kdy: 16. 08. 2020, 09:06:24 »

awk -F ";" '{print $1";;"$NF}' file

Re:Hrátky s textem
« Odpověď #4 kdy: 16. 08. 2020, 09:47:12 »
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


Re:Hrátky s textem
« Odpověď #5 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.

Re:Hrátky s textem
« Odpověď #6 kdy: 16. 08. 2020, 11:23:08 »
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 nebo csvsql https://csvkit.readthedocs.io/en/latest/scripts/csvsql.html

Re:Hrátky s textem
« Odpověď #7 kdy: 16. 08. 2020, 15:39:16 »
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.

Re:Hrátky s textem
« Odpověď #8 kdy: 16. 08. 2020, 16:26:13 »
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

tecka

  • ***
  • 185
Re:Hrátky s textem
« Odpověď #9 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/;.*;/;;/'

Re:Hrátky s textem
« Odpověď #10 kdy: 17. 08. 2020, 01:13:43 »
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:

Re:Hrátky s textem
« Odpověď #11 kdy: 17. 08. 2020, 16:08:36 »
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.

Kit

  • *****
  • 1 140
Re:Hrátky s textem
« Odpověď #12 kdy: 17. 08. 2020, 19:46:55 »
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.