Сопоставление двух файлов, строка за строкой?

Сопоставление двух файлов, строка за строкой?

У меня есть два файла, состоящие из чисел. Теперь я хочу сопоставить строку первого файла со всеми строками второго файла и увеличить счетчик, если совпадение найдено. Как написать 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)

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