Portál AbcLinuxu, 26. dubna 2024 02:29


Dotaz: Zpracovani textu pomoci AWK

1.3.2008 11:27 Adam Koutny
Zpracovani textu pomoci AWK
Přečteno: 304×
Odpovědět | Admin
Dobry den, resim problem ohledne zpracovani textu pod linuxem (tedy chci pouzit std unix. utility jako cat, sed, awk...)

mam dva soubory, prvni (a.txt) ma takovyto obsah:
A:10
B:30
D:33
druhy (b.txt) vypada takto:
1:3:8:2:5:19
Cisla v druhem souboru reprezentuji toto:

1 = A 3 = B ... 5 = E 19 = suma(A-E)

Ja bych potreboval soubor b.txt upravit podle prvniho souboru aby vypadal takto:
10:30:8:33:5:86
tzn hodnoty pismen, ktere se nachazeji v souboru a.txt (tedy A,B,D) prenesu na urcenou pozici v souboru b.txt a ty hodnoty (napr C), ktere se v prvnim souboru nenachazeji, ty v druhem souboru ponecham. Nakonec jeste zbyva vypocitat novou sumu.

Zacal jsem se ucit jazyk awk, ten je podle meho nazoru na tuto operaci idealni. Stale vsak nejak nemohu prijit na to, jak to cele provest. Perl ani python pouzit nechci. Budu rad za vsechny rady, dekuji.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

1.3.2008 12:14 Miška | skóre: 31 | Praha
Rozbalit Rozbalit vše Re: Zpracovani textu pomoci AWK
Odpovědět | | Sbalit | Link | Blokovat | Admin
cca +-
#!/bin/sh
cat a.txt | tr [A-F] [1-6] | sed 's|\([0-9]\):\([0-9]*\)|s:\1:\2:g|' > /tmp/tempfile.$$
SUM="`cat b.txt | sed -f /tmp/tempfile.$$`"
POM="`echo $SUM | sed 's|:|\ +\ |' | sed 's|+[0-9]*$||'`"
SUM="$SUM:`expr $POM`"
echo "$SUM" > b.txt
rm -f /tmp/tempfile.$$
1.3.2008 12:46 chearius | skóre: 7 | blog: /dev/chearius | Heidelberg
Rozbalit Rozbalit vše Re: Zpracovani textu pomoci AWK
Ten skript bohuzel nefunguje vzdycky spravne. V pripade, ze budou v souboru b.txt dve stejne hodnoty, tak je vysledek spatne. Napriklad:

a.txt
A:10
B:30
D:33
a b.txt
1:1:8:2:5:17
vrati vas skript vysledek:
10:10:8:30:5:107:
Spravny vysledek by ale mel podle mne byt
10:30:8:33:5:86
Problem prave v tech substitucich ukladanych do toho docasneho souboru.
1.3.2008 12:22 chearius | skóre: 7 | blog: /dev/chearius | Heidelberg
Rozbalit Rozbalit vše Re: Zpracovani textu pomoci AWK
Odpovědět | | Sbalit | Link | Blokovat | Admin
V awk by se to dalo resit treba takto (neni to idealni reseni, ale funguje):
BEGIN {
                FS = ":";
                cells = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                for (i = 0; i < length(cells); i++)
                        values[i] = "nan";
        }

/^[A-Z][:][0-9]+$/ {
                ind = index(cells, $1) - 1;
                if (ind >= 0)
                        values[ind] = $2;

        }

/^([0-9]+[:]?)+$/ {
                result = "";
                sum = 0;

                for (i = 0; i < NF - 1; i++) {
                        if (match(values[i], /[0-9]+/) > 0) {
                                result = result values[i] ":";
                                sum += values[i];
                        } else {
                                result = result $(i + 1) ":";
                                sum += $(i + 1);
                        }
                }

                result = result sum;
                print result;
        }
~
A pak to spustit pomoci awk -f vypocet.awk a.txt b.txt.

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.