2013-02-25 8 views
9

sto usando seguente script della shell di trovare contenuto di un file in un altro:trovare contenuto di un file in un altro file in UNIX shell script

#!/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 è la visualizzazione della contenuto dal file CSV. Il mio file content.txt contiene numeri come "08915673" o "123223" che sono presenti anche nel file csv. C'è qualcosa di sbagliato sto facendo?

+2

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

+1

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. –

risposta

27

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.

+0

quindi se si sostituisce = $ la riga grep -f funzionerà? –

+0

così con grep -f dà errore come ".rep: 0652-033 Impossibile aprire:" –

+0

Bene, il problema sembra esserci con il percorso del file. Sei sicuro che il percorso sia corretto? Prova ad abbracciare il nome del file con virgolette doppie. Come stai cercando di eseguire. Per favore, aggiungi la riga di comando che stai cercando di eseguire nel commento successivo. – Rubens

2

Un'altra soluzione:

  • uso awk, creare il proprio hash (ad esempio ahash), ogni controllo da soli.
  • sostituire $0 to $i, è possibile abbinare qualsiasi campo desiderato.

awk -F"," ' 
{ 
    if (nowfile==""){ nowfile = FILENAME; } 

    if(FILENAME == nowfile) 
    { 
    hash[$0]=$0; 
    } 
    else 
    { 
     if($0 ~ hash[$0]) 
     { 
      print $0 
     } 
    } 
} ' xx yy 
1

non credo che si ha realmente bisogno di uno script per eseguire quello 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

Spero che questo aiuta.

Problemi correlati