Compare dos lists de URL e imprima URL recién agregadas a un nuevo file

Inicialmente estoy produciendo dos files que contienen lists de URL. Me referiré a ellos como old y new . Me gustaría comparar los dos files y si hay alguna URL en el new file que no están en el file anterior, me gustaría que se muestren en un file extra_urls .

Ahora, he leído algunas cosas sobre el uso del command diff pero por lo que puedo decir, esto también analiza el order de la información. No quiero que la order tenga ningún efecto en la salida. Solo quiero que las URL adicionales se impriman en el file extra_urls , sin importar en qué order se coloquen en cualquiera de los otros dos files.

¿Cómo puedo hacer esto?

Puede usar el command comm para comparar dos files y mostrar selectivamente líneas únicas para una u otra, o las líneas en común. Requiere que las inputs sean orderadas, pero puede orderarlas sobre la marcha, mediante el uso de sustitución de processs.

 comm -13 <(sort old.txt) <(sort new.txt) 

Si está utilizando una versión de bash que no admite la sustitución de processs, se puede emular utilizando conductos con nombre. Un ejemplo se muestra en Wikipedia .

Yo solo usaría grep :

 grep -vFf old new > extra_urls 

Explicación

  • -f : le dice a grep que lea sus patrones de búsqueda desde un file. En este caso, old .
  • -v : le dice a grep que invierta la coincidencia, para que solo imprima líneas que no coincidan.
  • -F : le dice a grep que interprete sus patrones de búsqueda como cadenas, no expresiones regulares. De esa manera, el . de la URL se compararán literalmente.

Combinados, estos hacen que grep imprima cualquier línea new que no fuera old . El order de las URL en el file es irrelevante.

Como el order es importante para ti, usa awk

 awk ' NR == FNR {old[$1]=1; next} !($1 in old) ' old new > extra 

Tengo una aplicación llamada meld. Permite ver los dos (o tres) files, uno al lado del otro, muestra las diferencias y permite la copy selectiva de uno a otro o la eliminación de caracteres.

Meld se puede instalar desde una terminal con

 sudo apt-get install meld