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 B
es igual a un B A
par 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:
PROCINFO
Puede ser unagawk
extensión. Siawk
no 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
join
comando 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 2
puede ser reemplazado por-1 2 -2 2
(pero no por a-j2
menos que use GNUjoin
).El
awk
comando lee el resultado de esto y solo genera resultados que son pares que aún no se han visto.fuente
sort -b
ordenaría.join
requieren archivos de entrada ordenados.Una
python
solución El archivo de entrada se alimentaitertools.combinations
desde la biblioteca estándar, que genera tuplas de 2 longitudes formateadas e impresas en la salida estándar.fuente
Si ha
ruby
instalado:-0777
sorber 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$F
matriz$F.combination(2)
generar2
elementos 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
awk
fuente
Aquí hay uno en pura concha.
Ejemplo:
fuente
<file.dat xargs test.sh
quetest.sh $(cat file.dat)
Usando
Perl
podemos hacerlo como se muestra:fuente