Estoy tratando de escribir un script simple que enumere los contenidos encontrados en dos listas. Para simplificar, usemos ls como ejemplo. Imagina que "uno" y "dos" son directorios.
one = `ls one` dos = `ls dos` intersección $ uno $ dos
Todavía estoy bastante verde en bash, así que siéntete libre de corregir cómo estoy haciendo esto. Solo necesito algún comando que imprima todos los archivos en "uno" y "dos". Deben existir en ambos. Puede llamar a esto la "intersección" entre "uno" y "dos".
Respuestas:
fuente
comm
hasta hoy. Esto solo hizo toda mi semana :)comm
requiere que las entradas estén ordenadas. En este caso,ls
ordena automáticamente su salida, pero otros usos pueden necesitar hacer esto:comm -12 <(some-command | sort) <(some-other-command | sort)
public
métodoerror()
proporcionado por un rasgo, en combinación congit grep
, y fue increíble! Corrí$ comm -12 <(git grep -il "\$this->error(" -- "*.php") <(git grep -il "Dash_Api_Json_Response" -- "*.php")
y, afortunadamente, terminé con el nombre del archivo que contenía el rasgo.Solución con
comm
comm
es genial pero de hecho necesita trabajar con una lista ordenada. Y afortunadamente aquí usamosls
cuál de lals
página de manual de BashAlternativa con
sort
Intersección de dos listas:
diferencia simétrica de dos listas:
Prima
Juega con ello ;)
fuente
Usa el
comm
comando:"sort" no es realmente necesario pero siempre lo incluyo antes de usar "comm" por si acaso.
fuente
Una alternativa menos eficiente (que la comunicación):
fuente
(ls 1; ls 2) | sort -u | uniq -d
.sort -u | uniq -d
no hace nada, porque el tipo ha eliminado los duplicados antes de que uniq comience a buscarlos. Creo que no has entendido lo que está haciendo mi comando.cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
para emitir nada. Mi comando debería leer(ls 1; ls 2) | sort | uniq -d
, sin el-u
, para mostrar la intersección de la lista. @ MikaëlMayer tenía razón en que mi comando original estaba roto.ls
con otra cosa, por ejemplofind
. Su solución no permite esto, porque si uno de los comandos devuelve dos líneas iguales, lo recoge como un duplicado. El mío funciona incluso si el usuario quiere hacerls 1/*
y comparar todos los archivos en subdirectorios. De lo contrario, sí, también funciona. Es posible que el mío sea específico de bash.Unir es otra buena opción dependiendo de la entrada y la salida deseada
fuente
Hay otra pregunta de Stackoverflow "Intersección de matriz en bash", que está marcada como un duplicado de esto. En mi opinión, no es exactamente lo mismo, ya que esa pregunta habla sobre la comparación de dos matrices bash, mientras que esta pregunta se centra en los archivos bash. Una respuesta de una línea a la otra pregunta, que ahora está cerrada, es la siguiente:
La utilidad de comunicación realiza una ordenación alfanumérica, mientras que las respuestas "Array intersection in bash" usan números; de ahí el uso de "sort" y "sort -g".
fuente