%20%D0%B2%20%D0%B4%D0%B2%D1%83%D1%85%20%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D1%85%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D1%85%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D1%85.png)
У меня есть два текстовых файла с полями, разделенными пробелами (03 поля) в среде Linux:
Файл1: 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
Файл2: 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
Мне просто нужно сравнить значения столбца RAM Used файла ram-service1.txt со столбцом RAM Used файла ram-service2.txt в соответствии с их программами. Например, если значение RAM Used службы "firewalld" в файле ramservice1.txt больше или меньше значения RAM Used службы "firewalld" в файле ramservice2.txt, мне нужно перенаправить его (разницу + или -) в другой файл с именем программы.
Если кто-то сможет решить эту проблему, я буду очень благодарен, это очень поможет мне.
решение1
Попробуйте этот 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
Он column
просто преобразует вывод в удобный формат «диаграммы» и сохраняет его в файл outfile
.
решение2
join -1 3 -2 3 <(sort -k3 file1) <(sort -k3 file2) |
awk '$2 != $4 { printf("%20s:\t%+d\n", $1, $4 - $2) }'
Это объединит файлы на основе имени программы в третьем столбце. Каждый файл сортируется по этому полю, а затем join
считывает эти данные и выводит строки, для которых имя программы совпадает в обоих файлах. Вывод этого шага будет выглядеть так:
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
(и т. д.)
... где первый столбец теперь — это имя программы, второй — номер из первого файла, а четвертый столбец — номер из второго файла.
Программа awk
, которая это считывает, проверяет значения в столбцах 2 и 4, и если они различаются, она записывает строку с разницей.
Результат, учитывая данные в вопросе, будет
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
Отрицательное значение означает, что во втором файле оно меньше.