2つの異なるテキストファイルの2つの列(数字)を比較します。

2つの異なるテキストファイルの2つの列(数字)を比較します。

Linux環境には、スペースで区切られたフィールド(フィールド03)を持つ2つのテキストファイルがあります。

ファイル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 '
    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) }'

これにより、3番目の列のプログラム名に基づいてファイルがリンクされます。各ファイルはこのフィールドでソートされ、対応するjoinデータが読み取られ、プログラム名が一致する2つのファイルの行が出力されます。このステップの出力は次のとおりです。

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

(等)

...最初の列はプログラム名、2番目の列は最初のファイルの番号、4番目の列は2番目のファイルの番号です。

これを読み取るプログラムはawk2列と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

負の値は、2番目のファイルの値が小さいことを意味します。

関連情報