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.


« Poslední změna: 16. 08. 2020, 00:22:56 od scientific »


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 »
Kód: [Vybrat]
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.
« Poslední změna: 16. 08. 2020, 10:45:55 od scientific »

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 »
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.

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

Kód: [Vybrat]
perl -pe 's/(.*?;).*(;.*)/$1$2/'

oddelovac muze byt i viceznakove slovo

Kód: [Vybrat]
perl -pe 's/(.*?slovo).*(slovo.*)/$1$2/'

doporucuji pouzivat perl jako nahradu sedu, dialekt regexu v sedu je v dnesni dobe dost nestandardni
« Poslední změna: 16. 08. 2020, 16:27:53 od A.P.Hacker »

tecka

  • ***
  • 138
    • Zobrazit profil
    • E-mail
Re:Hrátky s textem
« Odpověď #9 kdy: 16. 08. 2020, 21:16:14 »
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á.
Kód: [Vybrat]
sed 's/;.*;/;;/'

Re:Hrátky s textem
« Odpověď #10 kdy: 17. 08. 2020, 01:13:43 »
Což v tomhle případě nehraje žádnou roli, protože nejprimitivnější regex udělá přesně to co má.
Kód: [Vybrat]
sed 's/;.*;/;;/'
Pěkně! :thumbsup:

Re:Hrátky s textem
« Odpověď #11 kdy: 17. 08. 2020, 16:08:36 »
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á.
Kód: [Vybrat]
sed 's/;.*;/;;/'

pravda, ale pokud je oddelovac delsi slovo, musite ho opakovat v nahrade.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Hrátky s textem
« Odpověď #12 kdy: 17. 08. 2020, 19:46:55 »
Kód: [Vybrat]
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.