Portál AbcLinuxu, 15. července 2025 13:54


Dotaz: úprava sloupce pomocí sed nebo awk

13.1.2008 17:02 pavel
úprava sloupce pomocí sed nebo awk
Přečteno: 957×
Odpovědět | Admin
Mám takovýto soubor:
-5,480183;-5,558819;2007-06-12 13:41:46;2007-06-12 13:41:46
-5,489931;5,567327;2007-06-12 13:51:47;2007-06-12 13:51:47
 5,506767;5,581762;2007-06-12 14:01:48;2007-06-12 14:01:48
Potřebuji toto:
-5,480183;-5,558819;2007-06-12 13:41:46;20070612134146
-5,489931;5,567327;2007-06-12 13:51:47;20070612135147
 5,506767;5,581762;2007-06-12 14:01:48;20070612140148
Funguje mi toto:
sed 's/\(.*\):/\1/;s/\(.*\):/\1/;s/\(.*\)-/\1/;s/\(.*\)-/\1/;s/\(.*\)[ \t]/\1/'
Nezná někdo jednodušší řešení pomocí sedu nebo awk?
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Josef Kufner avatar 13.1.2008 17:22 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
Odpovědět | | Sbalit | Link | Blokovat | Admin
Lze to napsat do jednoho regexpu, ale moc si nepomůžeš.
Hello world ! Segmentation fault (core dumped)
13.1.2008 17:51 YYY | skóre: 29 | blog: martinek
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
Odpovědět | | Sbalit | Link | Blokovat | Admin
AWK je na takoveto ukoly jako stvorene.

#!/usr/bin/awk -f

BEGIN {
        FS=";";
}

{
        split($4, Z1, " ");
        split(Z1[1], D, "-");
        split(Z1[2], T, ":");
        printf("%s;%s;%s;", $1, $2, $3);
        printf("%s%s%s", D[1], D[2], D[3]);
        printf("%s%s%s\n", T[1], T[2], T[3]);
}
Nevim, jestli to je jednodussi reseni ale pro mne osobne rozhodne ideologicky prijatelnejsi :-)
13.1.2008 22:06 pavel
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
Díky za všechny řešení. Měl bych ještě prosbu, byl bys tak hodný a rozepsal mi to řešení pomocí AWK, co dělá každý řádek? Je mi jasné BEGIN, FS, a printf("%s;%s;%s;", $1, $2, $3), není mi jasné to rozdělení čtvrtého pole na jednotlivé části.
Josef Kufner avatar 13.1.2008 23:43 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
man awk
/split
Hello world ! Segmentation fault (core dumped)
14.1.2008 00:09 YYY | skóre: 29 | blog: martinek
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
Mno ten awk programek, co jsem tam napsal, je jen tak pro legraci, protoze awk je takova moje mala uchylka. Zkusim to dat z pameti, protoze ten zdrojak nemam ted pred sebou: ve vzorku BEGIN specifikuju FIELD SEPARATOR na strednik, s prvnim, druhym a tretim polem nechci delat nic a proto je rovnou zobrazim. Prvnim splitem si rozdelim ctvrte pole podle mezery, do prvniho prvku pole Z dostanu datum a do druheho dostanu cas. Kazdy z tech prvku si dal rozsekam do pole podle oddelovace, ktery potrebuju(u data je to pomlcka a u casu dvojtecka). Nu a na zaver vsechno zobrazim. Pokud te zajima awk, doporucuji ti muj serial na strankach http://tuxbase.net
14.1.2008 00:26 pavel
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
Díky za odpověď a tvůj čas. Na různé seriály jsem se díval, ale asi skončím u knížky AWK&SED od cpress. Dobrou noc.
14.1.2008 00:37 YYY | skóre: 29 | blog: martinek
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
Nemas vubec zac, rad poradim :-) Jinak AWK & SED to je super knizka, mohu vrele doporucit. Dokonce se to i hezky cte pred spanim - vysledky voleb v bavorsku rulezzz :)
wamba avatar 13.1.2008 18:11 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
Odpovědět | | Sbalit | Link | Blokovat | Admin
v perlu by to šlo třeba takhle:

perl -wn -e '($m,$z)=/^(.*;)(.*)$/;print $m, $z =~ /(\d)/g,"\n";'

(v awku, nebo sedu nějak podobně :))
This would have been so hard to fix when you don't know that there is in fact an easy fix.
14.1.2008 13:22 Ash | skóre: 53
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
Odpovědět | | Sbalit | Link | Blokovat | Admin
sed -e "s/^\(.*;.*;.*;\)\([0-9]\+\)-\([0-9]\+\)-\([0-9]\+\) \([0-9]\+\):\([0-9]\+\):\([0-9]\+\).*$/\1\2\3\4\5\6\7/"
nebo klidně i
sed -e "s/\(....\)-\(..\)-\(..\) \(..\):\(..\):\(..\)[^;]*$/\1\2\3\4\5\6/"
a nebo jinak :)
14.1.2008 13:53 pavel
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
A teď mi to napiš pro skutečných 18 sloupců...
14.1.2008 18:16 Ash | skóre: 53
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
Bude to v podstatě totéž, jen mi musíte říct, kolikátý sloupec to je :) Pokud někde mezi 0. - 9. tak spíš první varianta, pokud 10. - .18 tak druhá varianta.
14.1.2008 18:22 Ash | skóre: 53
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
No a nebo mi to neříkejte a za číslo 3 dosaďte n-1 nebo N-n+1, kde N je počet sloupců a n je pořadí sloupce, kde jsou ty inikrimnované řetězce co je třeba pospojovat.
sed -e "s/^\(.*;\)\{3\}\([0-9]\+\)-\([0-9]\+\)-\([0-9]\+\) \([0-9]\+\):\([0-9]\+\):\([0-9]\+\).*$/\1\2\3\4\5\6\7/"

sed -e "s/\(....\)-\(..\)-\(..\) \(..\):\(..\):\(..\)\(.*;\)\{1\}$/\1\2\3\4\5\6/"
14.1.2008 23:29 pavel
Rozbalit Rozbalit vše Re: úprava sloupce pomocí sed nebo awk
Díky za ty skripty v sedu, reakce s těmi sloupci byla z mé strany chybná (sypu si popel na hlavu...). Nechtěl bys to poslat na UZITEČNÉ JEDNOŘÁDKOVÉ SKRIPTY PRO SED?

Příspěvek vyřešen.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.