比较两个不同文本文件中的两列(数字)

比较两个不同文本文件中的两列(数字)

我在 Linux 环境中有两个带有空格分隔字段(03 字段)的文本文件:

文件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-service1.txt 文件的“RAM 使用”列值与 ram-service2.txt 文件的“RAM 使用”列相对于其程序进行比较。例如,如果 ramservice1.txt 文件中的服务“firewalld”RAM 使用值大于或小于 ramservice2.txt 文件中的服务“firewalld”RAM 使用值,我需要将其重定向(差值 + 或 -)到另一个带有程序名称的文件。

如果有人能解决这个问题,我将非常感激,这对我来说是一个很大的帮助。 。

答案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

(ETC。)

...其中第一列现在是程序名称,第二列是第一个文件中的编号,第四列是第二个文件中的编号。

读取此内容的程序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

负值意味着第二个文件中的值较小。

相关内容