
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 Used 列の値を、それぞれのプログラムごとに ram-service2.txt ファイルの RAM Used 列の値と比較するだけです。たとえば、ramservice1.txt ファイル内のサービス「firewalld」の RAM Used 値が、ramservice2.txt ファイル内のサービス「firewalld」の RAM Used 値より大きいか小さい場合、それをプログラム名を持つ別のファイルにリダイレクトする必要があります (差異 + または -)。
誰かがこれを解決できれば本当に感謝し、私にとって大きな助けになります。
答え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) }'
これは、3番目の列のプログラム名に基づいてファイルを結合します。各ファイルはこのフィールドでソートされ、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
(等。)
...ここで、最初の列はプログラム名、2 番目の列は最初のファイルの番号、4 番目の列は 2 番目のファイルの番号になります。
これを読み取るプログラム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
負の値は、2 番目のファイルの方が小さいことを意味します。