Portál AbcLinuxu, 15. července 2025 10:28


Dotaz: zpracovani souboru awkem

3.1.2006 16:42 Karel Borkovec | skóre: 28 | blog: HP_NX9010 | Tábor
zpracovani souboru awkem
Přečteno: 102×
Odpovědět | Admin
Dobrý den. Řeším následující problém: Mám takovýto výpis v souboru:
  uzivatel1 in                                       :             94M
  uzivatel1 out                                      :             30M
  uzivatel2 in                                       :            315M
  uzivatel2 out                                      :             45M
  uzivatel3 in                                       :            169M
  uzivatel3 out                                      :             50M
Potřeboval bych dostat do souboru toto (tzn. sečíst odeslaná i přijatá data a zobrazit takto):
uzivatel1;	124
uzivatel2;	360
uzivatel3;	219
Zkoušel jsem to pomocí AWKu, ale hrozně v tom tápu. Neporadil by někdo prosím? Dekuji
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

3.1.2006 18:26 razor | skóre: 33
Rozbalit Rozbalit vše Re: zpracovani souboru awkem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud by si to chtěl v pythonu, tak by to šlo nějak takhle (netvrdím, že by to nešlo napsat lépe :-) )
import re

input = file('souborA', 'r')
output = file('souborB', 'w')

result = {}
try:
	for line in input.readlines():
		splitted = re.split('\s', line)
		key = splitted[0]
		value = int(re.split('\D', splitted[3])[0])
		if result.has_key(key):
			result[key] = result[key] + value
		else:
			result[key] = value
	for pairs in result.items():
		output.write(pairs[0] + ';\t' + str(pairs[1]) + '\n')
finally:
    input.close()
    output.close()
3.1.2006 20:37 Bones | skóre: 15 | blog:
Rozbalit Rozbalit vše Re: zpracovani souboru awkem
Odpovědět | | Sbalit | Link | Blokovat | Admin

AWK neumim (ale chci se ho nekdy naucit), tak ti alespon dam linky na dokumentaci.

Ceska: Tam najdes dalsi odkazy.
Anglicka: manualova stranka, info dokument, ci GAWK manual
3.1.2006 20:55 Franta Hanzlik
Rozbalit Rozbalit vše Re: zpracovani souboru awkem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nepopisujete presne strukturu vstupnich dat, takze zhruba :
awk 'BEGIN{MU="";SUM=0}{SUM1=gensub(/[^0-9]$/,"",1,$NF) + 0; if (MU == $1 || MU == ""){MU=$1;SUM+=SUM1} else {printf "%s - %i\n",MU,SUM; SUM=SUM1;MU=$1}}END{printf "%s - %i\n",MU,SUM}'
- nebo udelat awk script (a chmod +x) :
#!/bin/awk -f

BEGIN{MU="";SUM=0}      # MU: Minuly Uzivatel, SUM: jeho soucet dat
{SUM1=gensub(/[^0-9]$/,"",1,$NF) + 0    # na konci posledni polozky (=objem) urizni vse mimo cislice (tady rezu 'M')
if (MU == $1 || MU == ""){      # uzivatel na predchozi radce je stejny jako na aktualni nebo zacinam
        MU=$1;SUM+=SUM1
} else {
        printf "%s - %i\n",MU,SUM; SUM=SUM1;MU=$1} #zmena, vypisuji a minuly=aktualni
}
END{printf "%s - %i\n",MU,SUM} # a dotisk posledniho po zpracovani souboru
4.1.2006 01:41 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Proč AWK?
Odpovědět | | Sbalit | Link | Blokovat | Admin

AWK je velmi dobrá věc, ale je to trochu jednodušší s drobnou pomocí sedu:


cat vstup.txt | \
sed 's/ *\([^ \t]*\).*:[ \t]*\([0-9]*\).*/\1;\t\2/' | \
awk '{ if ( par % 2 ) { sum += $2; print $1 "\t" sum; } else { sum = $2; } par++; }' \
> vystup.txt


Tady se jasně dělí úlohy: sed edituje, awk počítá. Doufám, že to takhle stačí a že to pomůže. Pokud potřebujete ještě něco jiného, stačí říct. :-)

4.1.2006 02:22 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: zpracovani souboru awkem
Odpovědět | | Sbalit | Link | Blokovat | Admin
To množství dat bude vždycky v megabajtech? Pokud ne, zde máte další řešení v pythonu:
#!/usr/bin/env python
import re

infile = open('infile.dat')
regexp = re.compile(r'^\s+(\S+) (in|out)\s+:\s+(\d+)(.*)')
result={}
for line in infile.xreadlines():
  user, direction, amount, unit = re.search(regexp, line).groups()
  amount = int(amount)

  if 'G' in unit:
    amount *= 1024*1024*1024
  elif 'M' in unit:
    amount *= 1024*1024
  elif 'k' in unit:
    amount *= 1024

  try:
    result[user] += amount
  except KeyError:
    result[user] = amount

infile.close()

outfile = open('outfile.dat', 'w')
for user, amount in result.items():
  outfile.write('%s;\t%d\n' %(user, amount))
outfile.close()
A vůbec - tohle by přece měl dělat ten původní program, který vygeneroval ten soubor. Nebude lepší spíš zasáhnout do zdrojáku než parsovat výstup? Hrozí nebezpečí, že se časem změní formát nebo že bude potřeba nějaká informace, kterou původní program měl, ale nevypsal.
4.1.2006 16:19 Karel Borkovec | skóre: 28 | blog: HP_NX9010 | Tábor
Rozbalit Rozbalit vše Re: zpracovani souboru awkem
Možná by stálo ze to zasáhnout do zdrojáků toho programu (ipac-ng), ale to už je totálně nad moje znalosti...
4.1.2006 16:19 Karel Borkovec | skóre: 28 | blog: HP_NX9010 | Tábor
Rozbalit Rozbalit vše Re: zpracovani souboru awkem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Všem mockrát děkuji!

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.