2013-02-25 10 views
9

używam następujący skrypt, aby znaleźć zawartość jednego pliku do drugiego:znalezieniem zawartość jednego pliku do innego pliku w skrypcie powłoki Uniksa

#!/bin/ksh 
file="/home/nimish/contents.txt" 

while read -r line; do 
    grep $line /home/nimish/another_file.csv 
done < "$file" 

mam wykonywania skryptu, ale nie jest wyświetlające zawartość z pliku csv. Mój plik contents.txt zawiera numer, taki jak "08915673" lub "123223", które są również obecne w pliku csv. Czy coś jest nie tak?

+2

rozważa edytowanie pytania, aby uwzględnić 2 wiersze z każdego pliku i oczekiwane wyniki z uwzględnieniem tych danych wejściowych. Powodzenia. – shellter

+1

Powyższy skrypt nie używa zmiennej 'file' innej niż do zapisania tamtej nazwy. Spróbuj 'while read -r wiersz <$ file; do '. To powiedziawszy, 'ksh' jest do bani i nie sprawdziłem, co robi z' -r', aby wiedzieć, czy to zadziała. Co więcej, 'grep' będzie oczekiwać wyrażeń regularnych i dopasuje dowolną wartość zawierającą liczby, które masz, nawet jeśli linia w pliku csv ma ​​inne wiodące lub końcowe cyfry: możesz chcieć użyć' grep -w' lub podobnego. –

Odpowiedz

27

grep sama jest w stanie to zrobić. Wystarczy użyć flagi -f:

grep -f <patterns> <file> 

<patterns> jest plikiem zawierającym jeden wzorzec w każdej linii; i <file> to plik, w którym chcesz wyszukiwać rzeczy.

Należy pamiętać, że aby wymusić na grep rozważanie każdej linii wzorca, nawet jeśli zawartość każdej linii wygląda jak zwykłe wyrażenie, należy użyć flagi -F, --fixed-strings.

grep -F -f <patterns> <file> 

Jeśli plik jest CSV, jak pan powiedział, możesz zrobić:

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

Jako przykład rozważmy plik "a.txt" z następujących linii:

alpha 
0891234 
beta 

teraz plik "b.txt", z wierszami:

Alpha 
0808080 
0891234 
bEtA 

Wyjście z poniższego polecenia jest następująca:

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

Nie trzeba w ogóle for -loop tutaj; grep sama oferuje tę funkcję.


Teraz przy użyciu nazwy plików:

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

można zmienić ',' do separatora masz w pliku.

+0

, więc jeśli będę zastępować = linia $ będzie grep -f pracy? –

+0

, więc z grep -f daje błąd jako ".rep: 0652-033 Nie można otworzyć:" –

+0

Cóż, problem wydaje się być ze ścieżką pliku. Czy na pewno ścieżka jest poprawna? Spróbuj objąć nazwę pliku podwójnymi cudzysłowami. Jak to próbujesz wykonać. Dodaj wiersz polecenia, który chcesz uruchomić w następnym komentarzu. – Rubens

2

Innym rozwiązaniem:

  • użycie awk, tworzyć własne hash (np ahash), wszystkie kontroli przez siebie.
  • zamień $0 to $i, możesz dopasować dowolne pola.

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

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

Nie sądzę, czego naprawdę potrzebujesz, aby wykonać skrypt, co próbujesz zrobić.

Wystarczy jedno polecenie.W moim przypadku, w potrzebny numer identyfikacyjny w kolumnie 11 w pliku csv (znakiem „;” jako separatora)

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

Mam nadzieję, że to pomaga.

Powiązane problemy