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