Vergleichen zweier Spalten (numerisch) in zwei verschiedenen Textdateien

Vergleichen zweier Spalten (numerisch) in zwei verschiedenen Textdateien

Ich habe zwei Textdateien mit durch Leerzeichen getrennten Feldern (03 Felder) in einer Linux-Umgebung:

Datei1: ram-service1.txt

RAM used    Program

23500   kb  firewalld
14780   kb  tuned
10140   kb  polkitd
5370    kb  NetworkManager
4470    kb  rsyslogd
4270    kb  lvmetad
4240    kb  systemd
4010    kb  sshd(2)
3830    kb  systemd-journal
3720    kb  systemd-udevd
3120    kb  dhclient
1630    kb  qmgr
1590    kb  pickup
1180    kb  master
1070    kb  dbus-daemon
1000    kb  chronyd
1021.00 kb  sftp-server
1004.00 kb  login
967.00  kb  bash
867.00  kb  systemd-logind
741.00  kb  crond
734.00  kb  auditd
450.00  kb  irqbalance
397.00  kb  ramusage.sh
186.00  kb  pv

Datei2: ram-service2.txt

RAM used    Program

23540   kb  firewalld
14830   kb  tuned
10140   kb  polkitd
5450    kb  NetworkManager
4370    kb  rsyslogd
4270    kb  lvmetad
4250    kb  systemd
3720    kb  systemd-udevd
3720    kb  systemd-journal
3180    kb  dhclient
1870    kb  sshd
1680    kb  qmgr
1640    kb  pickup
1200    kb  login
1190    kb  master
1070    kb  dbus-daemon
1010    kb  chronyd
941.00  kb  bash
868.00  kb  systemd-logind
747.00  kb  crond
736.00  kb  auditd
450.00  kb  irqbalance
395.00  kb  ramusage.sh
183.00  kb  pv

Ich muss nur die Werte der Spalte „RAM Used“ der Datei ram-service1.txt mit der Spalte „RAM Used“ der Datei ram-service2.txt vergleichen, und zwar in Bezug auf ihre Programme. Wenn beispielsweise der Wert für „RAM Used“ des Dienstes „firewalld“ in der Datei ramservice1.txt größer oder kleiner ist als der Wert für „RAM Used“ des Dienstes „firewalld“ in der Datei ramservice2.txt, muss ich ihn (Differenz + oder -) in eine andere Datei mit dem Programmnamen umleiten.

Wenn das jemand lösen könnte, wäre ich wirklich dankbar, es wäre mir eine große Hilfe. .

Antwort1

Versuchen Sie Folgendes, awk:

awk '
    NR==FNR{s1[$3]=$1;next}
    {s2[$3]=$1}
    END{
        for (value in s1){
            if (s1[value]!=s2[value]) print s1[value]-s2[value],$2,value
        }
    }
' ram-service1.txt ram-service2.txt | column -t > outfile

Es columnbringt die Ausgabe einfach in ein schönes „Diagramm“-Format und speichert sie unter outfile.

Antwort2

join -1 3 -2 3 <(sort -k3 file1) <(sort -k3 file2) |
awk '$2 != $4 { printf("%20s:\t%+d\n", $1, $4 - $2) }'

Dies würde die Dateien basierend auf dem Programmnamen in der dritten Spalte zusammenführen. Jede Datei wird nach diesem Feld sortiert und joinliest dann diese Daten und gibt die Zeilen aus, für die der Programmname in beiden Dateien übereinstimmt. Die Ausgabe dieses Schritts würde wie folgt aussehen:

Program RAM used RAM used
NetworkManager 5370 kb 5450 kb
auditd 734.00 kb 736.00 kb
bash 967.00 kb 941.00 kb
chronyd 1000 kb 1010 kb
crond 741.00 kb 747.00 kb

(usw.)

... wobei die erste Spalte nun den Programmnamen, die zweite die Nummer aus der ersten Datei und die vierte Spalte die Nummer aus der zweiten Datei ist.

Das awkProgramm, das dies liest, prüft die Werte in Spalte 2 und 4 und schreibt, falls diese unterschiedlich sind, eine Zeile mit der Differenz.

Das Ergebnis wird, unter Berücksichtigung der Daten in der Frage, sein

      NetworkManager:   +80
              auditd:   +2
                bash:   -26
             chronyd:   +10
               crond:   +6
            dhclient:   +60
           firewalld:   +40
               login:   +196
              master:   +10
              pickup:   +50
                  pv:   -3
                qmgr:   +50
         ramusage.sh:   -2
            rsyslogd:   -100
             systemd:   +10
     systemd-journal:   -110
      systemd-logind:   +1
               tuned:   +50

Ein negativer Wert bedeutet, dass es in der zweiten Datei kleiner ist.

verwandte Informationen