trovare il contenuto di un file in un altro file nello script di shell di Unix

Sto usando il seguente script di shell per trovare il contenuto di un file in un altro:

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

Sto eseguendo lo script ma non sta visualizzando i contenuti dal file csv. Il mio file "08915673" contiene numeri come "08915673" o "123223" che sono presenti anche nel file csv. C’è qualcosa di sbagliato sto facendo?

grep stesso è in grado di farlo. Basta usare la flag -f :

 grep -f   

è un file contenente un pattern in ogni riga; e è il file in cui si desidera cercare le cose.

Si noti che, per forzare grep a considerare ogni linea come un modello, anche se il contenuto di ogni linea assomiglia a un’espressione regolare, si dovrebbe usare la flag -F, --fixed-strings .

 grep -F -f   

Se il tuo file è un CSV, come hai detto, puoi fare:

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

Ad esempio, considera il file “a.txt”, con le seguenti linee:

 alpha 0891234 beta 

Ora, il file “b.txt”, con le linee:

 Alpha 0808080 0891234 bEtA 

L’output del seguente comando è:

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

Non hai assolutamente bisogno di -loopare qui; grep stesso offre questa funzionalità.


Ora usando i nomi dei file:

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

Puoi cambiare ',' con il separatore che hai nel tuo file.

Un’altra soluzione:

  • usa awk , crea il tuo hash (ad es. ahash), tutto il controllo da solo.
  • sostituisci $0 to $i , puoi abbinare i campi che vuoi.

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

Non penso che tu abbia davvero bisogno di una sceneggiatura per eseguire ciò che stai cercando di fare.

Un comando è sufficiente. Nel mio caso, in necessario un numero di identificazione nella colonna 11 in un file csv (con “;” come separatore)

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