unix sed – Mostrar solo las líneas que están en todos los archivos de texto al menos una vez

Pregunta:

un.txt

cat a.txt
a
b
x
c

b.txt

cat b.txt
d
e
a
f

La Q:

SOMEMAGICK *.txt
a

P: ¿Cómo puedo mostrar solo las líneas que están en todos los archivos * .txt?

Respuesta:

Qué tal si

cat *.txt | sort | uniq -c | egrep "^ +$(ls -1 *.txt | wc -l) "

Y luego, para eliminar el número de apariciones, podría agregar …

cat *.txt | sort | uniq -c | egrep "^ +$(ls -1 *.txt | wc -l) " | sed -re 's/^ +[0-9]+ //'

Según el comentario de @Stephane, lo anterior no funcionará si una línea aparece varias veces dentro de un solo archivo. Aquí ordeno y unico cada archivo primero para evitar eso:

for f in *.txt; do sort -u $f > $f.uniqd; done
cat *.uniqd | sort | uniq -c | egrep "^ +$(ls -1 *.uniqd | wc -l) " | sed -re 's/^ +[0-9]+ //'

Aunque ahora ya no es una sola línea. 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Ir arriba