我在 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
负值意味着第二个文件中的值较小。