Esta pregunta está fuertemente relacionada con esta y esta pregunta. Tengo un archivo que contiene varias líneas donde cada línea es una ruta a un archivo. Ahora quiero emparejar cada línea con cada línea diferente (no en sí misma). También un par A Bes igual a un B Apar para mis propósitos, por lo que solo se debe producir una de estas combinaciones.
Ejemplo
files.dat se lee así en una notación abreviada, cada letra es una ruta de archivo (absoluta o relativa)
a
b
c
d
e
Entonces mi resultado debería verse más o menos así:
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
Preferiblemente me gustaría resolver esto en bash. A diferencia de las otras preguntas, mi lista de archivos es bastante pequeña (aproximadamente 200 líneas), por lo que usar bucles y capacidad de RAM no plantea problemas.

Respuestas:
Usa este comando:
PROCINFOPuede ser unagawkextensión. Siawkno lo admite, simplemente omita laPROCINFO["sorted_in"] = "@ind_str_asc"línea y canalice la salida ensort(si desea ordenar la salida).(Esto no requiere que se ordene la entrada).
fuente
Esto supone que ninguna línea en el archivo de entrada contiene espacios en blanco. También supone que el archivo está ordenado .
El
joincomando crea el producto cruzado completo de las líneas en el archivo. Lo hace uniendo el archivo consigo mismo en un campo no existente. El no estándar-j 2puede ser reemplazado por-1 2 -2 2(pero no por a-j2menos que use GNUjoin).El
awkcomando lee el resultado de esto y solo genera resultados que son pares que aún no se han visto.fuente
sort -bordenaría.joinrequieren archivos de entrada ordenados.Una
pythonsolución El archivo de entrada se alimentaitertools.combinationsdesde la biblioteca estándar, que genera tuplas de 2 longitudes formateadas e impresas en la salida estándar.fuente
Si ha
rubyinstalado:-0777sorber todo el archivo (debería estar bien, ya que se menciona en OP que el tamaño del archivo es pequeño)-F'\n'dividido según la nueva línea, por lo que cada línea será un elemento en la$Fmatriz$F.combination(2)generar2elementos de combinación a la vez{ |c| puts c.join(" ")}imprimir según sea necesario$F.uniq.combination(2)para 3 elementos a la vez:
Con
perl(no genérico)Con
awkfuente
Aquí hay uno en pura concha.
Ejemplo:
fuente
<file.dat xargs test.shquetest.sh $(cat file.dat)Usando
Perlpodemos hacerlo como se muestra:fuente