%20in%20zwei%20verschiedenen%20Textdateien.png)
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 column
bringt 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 join
liest 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 awk
Programm, 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.