encontrar contenidos de un archivo en otro archivo en script shell de Unix

Estoy usando la siguiente secuencia de comandos de shell para encontrar contenidos de un archivo en otro:

#!/bin/ksh file="/home/nimish/contents.txt" while read -r line; do grep $line /home/nimish/another_file.csv done < "$file" 

Estoy ejecutando el script, pero no muestra el contenido del archivo csv. Mi archivo contents.txt contiene un número como "08915673" o "123223" que también están presentes en el archivo csv. ¿Hay algo malo que estoy haciendo?

grep mismo puede hacerlo. Simplemente use la bandera -f :

 grep -f   

es un archivo que contiene un patrón en cada línea; y es el archivo en el que desea buscar cosas.

Tenga en cuenta que, para forzar a grep a considerar cada línea como un patrón, incluso si el contenido de cada línea se ve como una expresión regular, debe usar el indicador -F, --fixed-strings .

 grep -F -f   

Si su archivo es un CSV, como dijo, puede hacer:

 grep -f < (tr ',' '\n' < data.csv)  

Como ejemplo, considere el archivo “a.txt”, con las siguientes líneas:

 alpha 0891234 beta 

Ahora, el archivo “b.txt”, con las líneas:

 Alpha 0808080 0891234 bEtA 

El resultado del siguiente comando es:

 grep -f "a.txt" "b.txt" 0891234 

No necesitas nada for -loop aquí; grep sí ofrece esta característica.


Ahora usando sus nombres de archivo:

 #!/bin/bash patterns="/home/nimish/contents.txt" search="/home/nimish/another_file.csv" grep -f < (tr ',' '\n' < "${patterns}") "${search}" 

Puede cambiar ',' al separador que tiene en su archivo.

Otra solución:

  • usa awk , crea tu propio hash (ej. ahash), todo control por ti mismo.
  • reemplace $0 to $i , puede hacer coincidir cualquier campo que desee.

 awk -F"," ' { if (nowfile==""){ nowfile = FILENAME; } if(FILENAME == nowfile) { hash[$0]=$0; } else { if($0 ~ hash[$0]) { print $0 } } } ' xx yy 

No creo que realmente necesites un script para realizar lo que intentas hacer.

Un comando es suficiente. En mi caso, necesité un número de identificación en la columna 11 en un archivo csv (con “;” como separador)

 grep -f < (awk -F";" '{print $11}' FILE_TO_EXTRACT_PATTERNS_FROM.csv) TARGET_FILE.csv