2016-05-05 7 views
1

Ich habe zwei Dateien, Datei1 und Datei2. Ich möchte jede Zeile von Datei1 erreichen und dann suchen, wenn eine der Zeilen in Datei2 in Datei1 vorhanden ist. Ich verwende das folgende Bash-Skript, aber es scheint nicht zu funktionieren. Was soll ich ändern? (Ich bin neu im Bash-Scripting).Bash - zwei Dateien lesen und in Dateien suchen

#!/bin/bash 

while read line1  
do   
    echo $line1 
    while read line2 
    do 
     if grep -Fxq "line2" "$1" 
     then 
      echo "found" 
     fi 
    done < "$2"    
done < "$1" 

Hinweis: Beide Dateien sind Textdateien.

+1

Fügen Sie Beispiele für beide Dateien zu Ihrer Frage hinzu. – Cyrus

+0

@Cyrus: Sie sind beide TXT-Dateien. – Iceman

+0

Ersetzen Sie "line2" durch '" $ line2 "'. – Cyrus

Antwort

2

Verwenden grep -f

grep -f file_with_search_words file_with_content 

ist jedoch zu beachten, dass, wenn file_with_search_words Leerzeilen enthält alles angepasst werden. Aber das kann leicht vermieden werden, mit:

grep -f <(sed '/^$/d' file_with_search_words) file_with_content 

Aus der Manpage:

-f FILE, --file=FILE 
     Obtain patterns from FILE, one per line. If this option is used 
     multiple times or is combined with the -e (--regexp) option, search 
     for all patterns given. The empty file contains zero patterns, and 
     therefore matches nothing. 
+0

Und OP sollte besser sicher sein, dass 'file_with_search_words' keine Leerzeilen hat. –

+0

@ Mr.Llama Das ist wahr, danke für die Klärung! – andlrc

0

Sie können den Befehl „comm“ verwenden, vergleicht es zwei sortierte Dateien Zeile-für-Zeile

Dieser Befehl zeigt die gemeinsamen Zeilen in Datei1 und Datei2

comm -12 file1 file2 

Das einzige Problem mit diesem Befehl ist, dass Sie so müssen rt die Dateien vor, wie folgt aus:

sort file1 > file1sorted 

http://www.computerhope.com/unix/ucomm.htm

0

Datei 1

Line 1 
Line 3 
Line 6 
Line 9 

Datei 2

Line 3 
Line 6 


awk 'NR==FNR{con[$0];next} $0 in con{print $0}' file1 file2 

geben Ihnen

Line 3 
Line 6 

, dass der Inhalt in der Datei ist 2, die in file1 vorhanden ist.

Wenn Sie die Räume ignorieren möchten, können Sie mit dem folgenden erreichen.

awk 'NR==FNR{con[$0];next} !/^$/{$0 in con;print $0}' file1 file2