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 '
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
(등.)
...첫 번째 열은 이제 프로그램 이름이고, 두 번째 열은 첫 번째 파일의 번호이고, 네 번째 열은 두 번째 파일의 번호입니다.
이것을 읽는 프로그램은 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
음수 값은 두 번째 파일의 값이 더 작다는 것을 의미합니다.