grep
stesso è in grado di farlo. Usa semplicemente il flag -f
:
grep -f <patterns> <file>
<patterns>
è un file contenente un modello in ogni riga; e <file>
è il file in cui vuoi cercare le cose.
Nota che, per forzare grep
per considerare ogni riga uno schema, anche se il contenuto di ogni riga sembra un'espressione regolare, dovresti usare il flag -F, --fixed-strings
.
grep -F -f <patterns> <file>
Se il tuo file è un CSV, come hai detto, puoi fare:
grep -f <(tr ',' '\n' < data.csv) <file>
Ad esempio, considera il file "a.txt", con le seguenti righe:
alpha
0891234
beta
Ora, il file "b.txt", con le righe:
Alpha
0808080
0891234
bEtA
L'output del seguente comando è:
grep -f "a.txt" "b.txt"
0891234
Non hai bisogno di for
- loop qui; grep
stesso offre questa funzionalità.
Ora usando i tuoi nomi di file:
#!/bin/bash
patterns="/home/nimish/contents.txt"
search="/home/nimish/another_file.csv"
grep -f <(tr ',' '\n' < "${patterns}") "${search}"
Puoi cambiare ','
al separatore che hai nel tuo file.
Un'altra soluzione:
- usa
awk
e crea il tuohash
(es. ahash), tutto controllato da te. - sostituisci
$0 to $i
e puoi abbinare tutti i campi che desideri.
awk -F"," '
{
if (nowfile==""){ nowfile = FILENAME; }
if(FILENAME == nowfile)
{
hash[$0]=$0;
}
else
{
if($0 ~ hash[$0])
{
print $0
}
}
} ' xx yy