PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : dateien vergleichen und differenzen ermitteln


meinereinerseiner
13-06-2001, 14:22
Hi,

ihr allwissenden User - ich hab mal wieder ein Problem:

ich hab 2 dateien mit z.b. folgenden Aufbau:
Dat1:
aaa 100
bbb 103
ccc 20

Dat2:
aaa 104
bbb 99
ccc 20

Als Ergebniss bräuchte ich sowas:
Dat3:
aaa +4
bbb -4
ccc 0

also quasi die differenz der Zahlenwerte 1 u 2.
Hat vielleicht jemand eine Idee, wie mann sowas mit der shell bewerkstelligt?


der tom

[ 13. Juni 2001: Beitrag editiert von: meinereinerseiner ]

jgbauman
13-06-2001, 14:46
Hi,

mit perl oder python ging das sicher einfacher, aber bitte sehr.

#!/bin/bash
sort dat1.txt > t1.txt
sort dat2.txt > t2.txt
(join -j 1 -e 0 -o 1.1 1.2 2.2 t1.txt t2.txt;
join -v 1 -j 1 -e 0 -o 1.1 1.2 2.2 t1.txt t2.txt;
join -v 2 -j 1 -e 0 -o 2.1 1.2 2.2 t1.txt t2.txt ;) | \
sort | \
sed -e "s/\(.*\) \(.*\) \(.*\)/echo \1 \$((\2-\3))/" | \
bash \
> dat3.txt
rm t1.txt t2.txt

meinereinerseiner
13-06-2001, 16:53
Hi,

ich habs mal versucht - hier mein code:
#!/bin/bash

sort dat1.txt > t1.txt
sort dat2.txt > t2.txt
(join -j 1 -e 0 -o 1.1 1.2 2.2 t1.txt t2.txt;
join -v 1 -j 1 -e 0 -o 1.1 1.2 2.2 t1.txt t2.txt;
join -v 2 -j 1 -e 0 -o 2.1 1.2 2.2 t1.txt t2.txt | \
sort | \
sed -e "s/\(.*\) \(.*\) \(.*\)/echo \1 \$((\2-\3))/" | \
bash \
> dat3.txt
rm t1.txt t2.txt

aber das tut nicht - syntax error: unexpected end of file

denke mal, da fehlt noch was, oder

der tom

meinereinerseiner
13-06-2001, 16:56
hmmm - der smiley war nicht grundlos dort - nun tuts

danke

jgbauman
13-06-2001, 21:00
Ich hasse diese automatische Smiley-ersetzung. :-(

meinereinerseiner
13-06-2001, 21:17
ja, sie sind nicht ohne.

aber ich hab mal noch eine frage zum script.

wenn die dateien einen anderen aufbau haben,
was muss ich da ändern, hab mir zwar mal die manpage zu join angesehen, komme damit aber nicht klar.

wie ist das bei z.B.

dat1.txt
-------72 liste1
------131 sub_liste1.2
-----8374 listen3_4

dat1.txt
------172 liste1
------131 sub_liste1.2
-----8374 listen3_4

wobei ein "-" für ein eigentliches leerzeichen steht, aber das stellt der hier nicht richtig dar.


der tom

[ 13. Juni 2001: Beitrag editiert von: meinereinerseiner ]

jgbauman
14-06-2001, 00:34
Bei sort mit -k 2 ergaenzt (sortieren nach der zweiten Spalte).
bei join aus -j 1 -j 2 gemacht (joinen nach der zweiten Spalte)
Aus den .1 und .2 des Ausgabeformats .2 und .1 gemacht. (Da 1. und 2. Spalte vertauscht sind)
bingo
#!/bin/bash
sort -k 2 dat1.txt > t1.txt
sort -k 2 dat2.txt > t2.txt
(join -j 2 -e 0 -o 1.2 1.1 2.1 t1.txt t2.txt;
join -v 1 -j 2 -e 0 -o 1.2 1.1 2.1 t1.txt t2.txt;
join -v 2 -j 2 -e 0 -o 2.2 1.1 2.1 t1.txt t2.txt;) | sort | \
sed -e "s/\(.*\) \(.*\) \(.*\)/echo \1 \$((\2-\3))/" | bash \
> dat3.txt
rm t1.txt t2.txt

meinereinerseiner
14-06-2001, 08:24
danke nochmal - jetzt kann ich dem auch folgen.

der tom