比較兩個不同文字檔案中的兩列(數字)

比較兩個不同文字檔案中的兩列(數字)

我在 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

負值意味著第二個文件中的值較小。

相關內容