grep
è in grado di farlo. È sufficiente utilizzare il flag -f
:
grep -f <patterns> <file>
<patterns>
è un file che contiene uno schema in ogni riga; e <file>
è il file in cui si desidera cercare le cose.
Si noti che, per imporre a grep
di considerare ogni linea come un motivo, anche se il contenuto di ogni riga appare come un'espressione regolare, è necessario utilizzare la bandiera -F, --fixed-strings
.
grep -F -f <patterns> <file>
Se il file è un CSV, come hai detto, è possibile farlo:
grep -f <(tr ',' '\n' < data.csv) <file>
A titolo di esempio, si consideri il file "a.txt", con le seguenti righe:
alpha
0891234
beta
Ora, il file "b.txt", con le linee:
Alpha
0808080
0891234
bEtA
L'uscita del seguente comando è:
grep -f "a.txt" "b.txt"
0891234
Non hanno bisogno a tutti per for
-loop qui; grep
offre questa funzione.
Ora utilizzando i nomi di file:
#!/bin/bash
patterns="/home/nimish/contents.txt"
search="/home/nimish/another_file.csv"
grep -f <(tr ',' '\n' < "${patterns}") "${search}"
Potete cambiare ','
al separatore che avete nel vostro file.
considera la modifica della domanda in modo da includere 2 righe da ciascun file e l'output previsto in base a tali input. In bocca al lupo. – shellter
Lo script sopra non usa la variabile 'file' se non per registrare il nome lì. Prova 'mentre leggi -r line <$ file; do'. Detto questo, 'ksh' fa schifo e non ho controllato cosa fa con' -r' per sapere se funzionerà. Inoltre, 'grep' si aspetta espressioni regolari e corrisponde a qualsiasi valore contenente i numeri che hai anche se la riga nel file csv ha altre cifre iniziali o finali: potresti volere' grep -w' o simile. –