Tengo 3 archivos con datos similares. Quiero un script bash que pueda leer los 3 archivos y generar las entradas únicas con sus valores. Ejemplo:
1.txt
aceE 14
aceF 8
adhE 20
asnS 2
carB 2
dnaK 3
eno 2
2.txt
aceE 11
aceF 7
acnB 2
acrB 1
adhE 22
asnS 2
dapD 3
3.txt
aceE 16
aceF 10
adhE 18
aroK 2
asnS 3
dapD 4
dnaK 4
Entonces la salida debería verse así:
acnB 2
acrB 1
aroK 2
carB 2
eno 2
Respuesta1
Con GNU uniq
o compatible (para la -w
opción):
sort {1,2,3}.txt | uniq -u -w5
acnB 2
acrB 1
aroK 2
carB 2
eno 2
editar: para ser un poco más flexible con las longitudes del primer campo, se podría implementar parte del enfoque de Guillermo.
grep -f <(sort {1,2,3}.txt | cut -d' ' -f1 | uniq -u) <(sort {1,2,3}.txt)
Resulta que el delimitador en los archivos de entrada es <tab>
y no <space>
. Esto se cambió al pegar los archivos de entrada en la pregunta. :-(
Sin embargo, esto debería funcionar con <tab>
.
grep -f <(sort {1,2,3}.txt | cut -f1 | uniq -u) <(sort {1,2,3}.txt)
Respuesta2
Propongo esto:
sort {1,2,3}.txt | cut -d' ' -f1 | uniq -u | xargs -I '{}' grep -h "{}" {1,2,3}.txt
Ordene el contenido de los archivos:
sort {1,2,3}.txt
Genere solo la primera columna:
cut -d' ' -f1
Filtrar únicos:
uniq -u
acnB
acrB
aroK
carB
eno
Con la alimentación de salida grep
:
xargs -I '{}' grep -h "{}" {1,2,3}.txt
acnB 2
acrB 1
aroK 2
carB 2
eno 2
Respuesta3
Con awk
:
awk '
n[$1]++ {delete s[$1]; next}
{s[$1] = $0}
END {for (i in s) print s[i]}' [123].txt
Respuesta4
Usando Molinero (https://github.com/johnkerl/miller) y corriendo
mlr --csv --fs "\t" -N count-similar -g 1 then filter '$count==1' then cut -x -f count 1.txt 2.txt 3.txt
usted tendrá
carB 2
eno 2
acnB 2
acrB 1
aroK 2