
У меня есть два файла, состоящие из чисел. Теперь я хочу сопоставить строку первого файла со всеми строками второго файла и увеличить счетчик, если совпадение найдено. Как написать bash-скрипт для этого?
file1:
1
2
3
4
5
6
file2:
2
3
6
10
12
13
23
counter = 3
решение1
Предположим , что file1.txt
и file2.txt
имеем такие наборы чисел:
file1.txt
:
1
2
4
6
7
file2.txt
:
2
6
7
8
9
Вы можете попробовать несколько подходов в зависимости от того, что вы хотите делать с данными или что еще вы хотите собрать по ходу дела.
Grep может искать в файле строку шаблона. Шаблоны могут быть предоставлены с помощью другого файла с использованием флага
-f
.-x
Флаг также гарантирует, что вы найдете только совпадения целых строк, так что шаблон '2' не будет соответствовать '24'. Наконец, флаг-c
подсчитывает количество совпадений. Собрав все вместе, вы получите:grep -x -c -f file1.txt file2.txt
Если вы хотите выполнить с числами какие-то другие действия, помимо подсчета общего количества, вы можете воспользоваться более ручным подходом:
counter=0 while read number; do grep -q -x "$number" file2.txt && let counter=$counter+1 done < file1.txt echo $counter
Это гораздо менее эффективно, так как вы снова читаете file2.txt для каждой строки в file1.txt, но если вы также хотите сделать что-то еще с числом или манипулировать файлом по пути, было бы проще вставить патч в цикл, как этот. Не использование флага,
-q
поэтому grep молчит и возвращает только код выхода. Используя этот код, мы можем определить, было ли найдено совпадение или нет, и только увеличить счетчик, если оно было найдено.
В любом случае, убедитесь, что вы учитываете возможность того, что некоторые строки будут частичными совпадениями для чисел, которые являются подстроками других чисел. Также вам нужно подумать о том, что вы хотите, чтобы произошло, если в строке будет более одного совпадения. Увеличивает ли каждый дубликат счетчик или это происходит только один раз. Обратите внимание, что два варианта выше обрабатывают это по-разному! Для некоторых наборов данных они дадут разные результаты. Если вы хотите, чтобы они давали одинаковые результаты, можно адаптировать оба метода. Например, первый может проверить версию файла, в которой удалены все дубликаты, поэтому ничто не будет совпадать более одного раза:
grep -x -c -f <(sort -u file1.txt) <(sort -u file2.txt)