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

У меня два файла, состоящих из чисел. Теперь я хочу совместить строку первого файла со всей строкой второго файла и увеличивать счетчик, если совпадение найдено. Как написать скрипт bash для этого?

file1: 1 2 3 4 5 6 file2: 2 3 6 10 12 13 23 counter = 3 

One Solution collect form web for “Соответствие двух файлов по строкам?”

Предполагая, что 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) 
  • Что делает `<& -` делать?
  • Каков наиболее правильный способ передать массив функции?
  • Две трубы для одной команды
  • Как я могу преобразовать эту функцию bash в оболочку рыбы
  • использование! -d в условии if
  • Crontab не запускает сценарий оболочки
  • Как работает cat> file << "END"?
  • Почему этот фрагмент оболочки проверяет, были ли хосты запущены с отключением netcat преждевременно?
  • netcat в сценарии оболочки, дающий недействительное соединение
  • Что делают bash-builtins 'set' и 'export'?
  • Как создать переменную только для размера, используемого и доступного для df?
  • Linux и Unix - лучшая ОС в мире.