Ahora que entiendo lo que quiere decir con "matriz", piense, antes que nada, que debería considerar usar matrices Bash reales. Son mucho más flexibles, ya que (por ejemplo) los elementos de matriz pueden contener espacios en blanco, y puede evitar el riesgo de que *
y ?
activen la expansión del nombre de archivo.
Pero si usted prefiere utilizar su actual enfoque de cadenas delimitadas por espacio, entonces estoy de acuerdo con la sugerencia del RHT utilizar Perl:
result=$(perl -e 'my %array2 = map +($_ => 1), split /\s+/, $ARGV[1];
print join " ", grep $array2{$_}, split /\s+/, $ARGV[0]
' "$array1" "$array2")
(Los saltos de línea son sólo para facilitar la lectura, se puede deshacerse de ellos si lo desea.)
en el comando Bash anteriormente, el programa Perl incrustado crea un hash llamado %array2
que contiene los elementos de la segunda matriz, y luego se imprime ningún elemento de la primera matriz que existe en %array2
.
Esto se comportará de forma ligeramente diferente a su código en la forma en que maneja los valores duplicados en la segunda matriz; en su código, si array1
contiene x
dos veces y array2
contiene x
tres veces, y luego result
contendrá x
seis veces, mientras que en mi código, result
contendrá x
sólo dos veces. No sé si eso importa, ya que no conozco sus requisitos exactos.
Pongo No creo que vayas a encontrar una mejor manera de hacer esto. Bash realmente no está diseñado para la manipulación de matrices, y no puedo pensar en una herramienta de línea de comandos que pueda usarse para encontrar la intersección de dos matrices. –
Aquí es donde brilla Perl. – RHT