Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Husqvik 09. 05. 2013, 09:07:30

Název: Sloučení řádků z více souborů
Přispěvatel: Husqvik 09. 05. 2013, 09:07:30
Ahoj,
potreboval bych radu ohledne slouceni dat z vice souboru. Mam udelany skript, ktery kazdou hodinu pomoci SNMP sesbira udaje ze zarizeni (teplotu) a ulozi to do souboru. Struktura vysledneho souboru je nasledujici:

Kód: [Vybrat]
Zarizeni_1 38
Zarizeni_2 39
Zarizeni_3 45

A ted bych potreboval jak tyto sesbirane hodnoty za jeden den nasypat do jednoho souboru. Aby byl vysledek tento:
Kód: [Vybrat]
Zarizeni_1 38 37 38 39.....
Zarizeni_2 39 41 38 46.....
Zarizeni_3 45 44 49 46....

Zkousel jsem prikaz join, ale ten umi jenom sloucit jen dva soubory. Resp. nepodarilo se mi ho presvedcit fungovat spravne - ve vyslednem souboru jsem mel vzdy jenom dve hodnoty (z prvniho a posledniho souboru). Nenakopnul by me nekdo spravnym smerem - idealne v awk, v tom se neco malo (spis hodne malo :P) orientuju.

Diky moc.

Husqvik
Název: Re:Slouceni radku z vice souboru do jednoho
Přispěvatel: alfi 09. 05. 2013, 09:26:17
zkusil bych awk, ala tady http://stackoverflow.com/questions/5467690/how-to-merge-two-files-using-awk
otázka je, jak funguje těch víc hodinových(?) souborů - jestli vždy existují nebo některý soubor/řádek v něm může chybět. pokud vždy všechny existují, stačí všechny napřed ve správném pořadí sloučit do jednoho :-)
Název: Re:Slouceni radku z vice souboru do jednoho
Přispěvatel: Mirek Prýmek 09. 05. 2013, 09:31:55
Jak říká Alfi - pokud mají soubory pevný formát, kterému se dá věřit, pak prvně ze všech extrahovat ten druhý sloupec a sloučit třeba pomocí http://linux.die.net/man/1/paste

Pokud ne, tak se nějakému tomu pythonu, perlu apod. nevyhneš. Bude to strašlivá námaha tak na deset řádků :)
Název: Re:Slouceni radku z vice souboru do jednoho
Přispěvatel: j 09. 05. 2013, 10:01:01
Jop, a pokud si to chces do budoucna vylepsit, tak to laduj do databaze.
Název: Re:Slouceni radku z vice souboru do jednoho
Přispěvatel: Mirek Prýmek 09. 05. 2013, 10:02:21
Jop, a pokud si to chces do budoucna vylepsit, tak to laduj do databaze.
Ovšem fklaudu!
Název: Re:Slouceni radku z vice souboru do jednoho
Přispěvatel: Jim 09. 05. 2013, 10:50:48
Primluvil bych se za db rovnou, je to napsane hned a lepe se s tim pracuje.
Název: Re:Slouceni radku z vice souboru do jednoho
Přispěvatel: Husqvik 09. 05. 2013, 11:03:16
Dekuji vsem za tipy. Databazi vylucuju, zadnou tam nemam a vzhledem k tomu, ze to potrebuju jenom docasne, tak je to zbytecne.
Zkusim to AWK a uvidime - snad z toho neco dostanu :-)

Jeste jedno diky.

Husqvik
Název: Re:Sloučení řádků z více souborů
Přispěvatel: Rejpal 09. 05. 2013, 12:31:52
"... Databazi vylucuju, zadnou tam nemam..."

Operační systém, který zná awk a neobsahuje ani jedinou databázi - to existuje?
Název: Re:Sloučení řádků z více souborů
Přispěvatel: Jirka Chmiel 09. 05. 2013, 12:43:58
Je to sice trochu divoké, ale co takhle:

Kód: [Vybrat]
eval "cat `ls -xrt *.txt | sed 's/  / | join - /g'`"
Předpokláda to, že soubory mají příponu txt a teploty se řadí podle času.
Název: Re:Slouceni radku z vice souboru do jednoho
Přispěvatel: j 09. 05. 2013, 15:28:17
Dekuji vsem za tipy. Databazi vylucuju, zadnou tam nemam a vzhledem k tomu, ze to potrebuju jenom docasne, tak je to zbytecne.
Zkusim to AWK a uvidime - snad z toho neco dostanu :-)

Jeste jedno diky.

Husqvik

Mno ... ne ze by to nebylo mozny, ale dovolim si tvrdit, ze tam na 99,9999% databazi mas. Rek bych, ze SQLite urcite.
Název: Re:Sloučení řádků z více souborů
Přispěvatel: kubbing 09. 05. 2013, 17:35:36
co treba:
Kód: [Vybrat]
#!/usr/bin/env ruby

hash = Hash.new { |hash, key| hash[key] = Array.new; }

while line = gets
split = line.split(' ')
key = split[0]
val = split[1]
hash[key] << val
end

hash.each_key do |key|
puts key + ' ' + hash[key].join(' ')
end
a pouziti:
Kód: [Vybrat]
$ cat *.txt | ./script.rb
Název: Re:Sloučení řádků z více souborů
Přispěvatel: minimir 09. 05. 2013, 18:39:33
Nebylo by lepší upravit ten skript, který ti ty soubory generuje?
Název: Re:Sloučení řádků z více souborů
Přispěvatel: aaa158 09. 05. 2013, 22:10:57
rrdtool
Název: Re:Sloučení řádků z více souborů
Přispěvatel: slonik 10. 05. 2013, 00:39:23
na root.cz nikto nepouziva shell? to su mi veci...

Kód: [Vybrat]
cut -d ' ' -f 2 t2.txt  | paste t1.txt  -
Název: Re:Sloučení řádků z více souborů
Přispěvatel: Mirek Prýmek 10. 05. 2013, 00:48:21
na root.cz nikto nepouziva shell? to su mi veci...
Spíš sis nepřečetl předchozí odpovědi, ne?
Název: Re:Sloučení řádků z více souborů
Přispěvatel: JZ 13. 05. 2013, 13:55:46
Zdravim,
na shell script viz. prispevek vyse nemam, ale v awk jsem neco "sesmolil". Dodelej dle potreby, ale jinak je to funkcni i bez uprav.

BEGIN {
  x = 1
  y = 0
  FS = " "
  soubor = ""
}

{
  if(soubor != FILENAME) {
    soubor = FILENAME
    x = 1
    y++
  }

  tag = $1
  pole1[tag] = tag
  pole2[tag,y] = $2
  x++
}

END {
   for(p in pole1) {
    printf("%s", p)
    for(i = 1; i < x; i++) {
      printf(" %s", pole2[p,i])
    }
    print ""
  }
}

Upravuj a uzivej dle libosti.  :)