Сравнение двух столбцов (числовых) в двух разных текстовых файлах

Сравнение двух столбцов (числовых) в двух разных текстовых файлах

У меня есть два текстовых файла с полями, разделенными пробелами (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

Отрицательное значение означает, что во втором файле оно меньше.

Связанный контент