Пока читается цикл с grep

Пока читается цикл с grep

У меня есть файл csv со множеством строк, и мне нужно найти некоторые совпадения и вывести их в файл. Мои данные такие:

Файл 1

qwerty
asdfgh
zxcvbn
qwerty
aassdd
zzxxcc
yyuuii
tttttt

Мне нужно сопоставить:

Файл 2

qwert
tttttt
aassdd.

Поскольку мой файл большой и список для сопоставления длинный, я делаю следующее:

while read n ; do grep $n File_1.csv >> results.csv ; done < File_2.csv

Я не могу получить желаемый результат.

решение1

Вам не нужно выполнять цикл; -fопция берет файл с шаблонами для поиска:

grep -Ff File_2.csv File_1.csv > results.csv

Я также добавил -Fопцию, чтобы поисковые термины обрабатывались буквально, а не как регулярные выражения.

решение2

Если в каждом файле нет дубликатов, то вы можете сделать следующее:

# In file_1 and file_2
sort file_1 file_2 | uniq -d
# In file_1 or file_2 but not both
sort file_1 file_2 | uniq -u
# In file_1 and not file_2
sort file_1 file_2 | uniq -d | sort - file_1 | uniq -u
# In file_2 and not file_1
sort file_1 file_2 | uniq -d | sort - file_2 | uniq -u

решение3

Утилита grepможет считывать шаблоны из одного файла и сопоставлять их с содержимым другого файла. Цикл в оболочке не требуется.

$ grep -f patterns file

Используя два файла, которые есть в вашем вопросе (файл 1 — это , fileа файл 2 — это patterns), это дает

qwerty 
qwerty 
tttttt 

Для соответствия шаблонам из patternsфиксированных строк (не регулярных выражений) добавьте -F:

$ grep -F -f patterns file

Для приведенного примера это дает тот же результат, что и без -F.

Чтобы принудительно сопоставить все строки, добавьте -x:

$ grep -x -F -f patterns file
tttttt   

Поскольку qwertyсовпадение не qwertполное, эти строки не возвращаются.

Связанный контент