두 개의 서로 다른 텍스트 파일의 두 열(숫자)을 비교합니다.

두 개의 서로 다른 텍스트 파일의 두 열(숫자)을 비교합니다.

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

(등.)

...첫 번째 열은 이제 프로그램 이름이고, 두 번째 열은 첫 번째 파일의 번호이고, 네 번째 열은 두 번째 파일의 번호입니다.

이것을 읽는 프로그램은 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

음수 값은 두 번째 파일의 값이 더 작다는 것을 의미합니다.

관련 정보