У меня есть файл 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
полное, эти строки не возвращаются.