%20en%20dos%20archivos%20de%20texto%20diferentes.png)
Tengo dos archivos de texto con campos delimitados por espacios (03 campos) en entorno Linux:
Archivo1: 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
Archivo2: 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
Solo necesito comparar los valores de la columna RAM utilizada del archivo ram-service1.txt con la columna RAM utilizada del archivo ram-service2.txt respectivamente a sus programas. Como ejemplo, si el valor de RAM utilizada del servicio "firewalld" en el archivo ramservice1.txt es mayor o menor que el valor de RAM utilizada del servicio "firewalld" en el archivo ramservice2.txt, necesito redirigirlo (diferencia + o -) a otro archivo con el nombre del programa.
Si alguien puede resolver esto se lo agradecería mucho y es de gran ayuda para mí. .
Respuesta1
Prueba esto:
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
Simplemente column
coloca el resultado en un bonito formato de "gráfico" y lo guarda en outfile
.
Respuesta2
join -1 3 -2 3 <(sort -k3 file1) <(sort -k3 file2) |
awk '$2 != $4 { printf("%20s:\t%+d\n", $1, $4 - $2) }'
Esto uniría los archivos según el nombre del programa en la tercera columna. Cada archivo se ordena en este campo y luego join
lee esos datos y genera las líneas para las cuales el nombre del programa coincide en ambos archivos. El resultado de ese paso se vería así
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.)
... donde la primera columna ahora es el nombre del programa, la segunda es el número del primer archivo y la cuarta columna es el número del segundo archivo.
El awk
programa que lee esto prueba los valores de las columnas 2 y 4, y si son diferentes escribe una línea con la diferencia.
El resultado, dados los datos de la pregunta, será
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
Un valor negativo significa que es más pequeño en el segundo archivo.