Соответствие 3 или более слов из полей в отдельных файлах csv

У меня два файла csv:

Это csv1:

11, The Sun Still Shines in Reading, 64312, 464566 13, You and Me Together Again London, 564564, 131355 12, What's the Story Now Your Gone, 4545646, 1124545 17, Hello I love you, 456899, 1259898 

Это csv2:

 69, The Sun Shines, 6464, 52364 12, Tell me your name, 56456, 21345 17, From London to New York, 897944, 234655 97, Reading Still Shines, 545464, 16748967 

У меня есть этот код, который позволяет сопоставлять названия (которые находятся в поле 2).

 cat $csv1 |cut -d, -f2 | while read p; do grep -i "$p" $csv2 if [ $? -eq 0 ];then grep -i "$p" $csv1 fi done 

На данный момент этот код просматривает каждую строку в csv1, а если есть строка в csv2, которая имеет соответствующий заголовок, то она печатает соответствующие строки вместе. Это работает очень хорошо.

Тем не менее, теперь я хотел бы адаптировать сценарий, чтобы вместо поиска точного названия он проверял, есть ли 3 или более слов.

Таким образом, вывод в случае данных csv на этой странице будет:

 11, The Sun Still Shines in Reading, 64312, 464566 69, The Sun Shines, 6464, 52364 97, Reading Still Shines, 545464, 16748967 

Которая состоит из строки csv1 сверху, а затем две строки из csv2, которые имеют 3 или более совпадающих слова в поле 2 (заголовок). Как указать количество совпадающих слов?

EDIT: Одна вещь, о которой я забыл упомянуть, заключается в том, что csv1 будет значительно меньше по размеру в строках, чем csv2 (например, 10 в сравнении с тысячами), хотя, думая об этом, я думаю, это не имеет большого значения, поскольку я могу определить самые большие данные либо как csv1 или csv2.

  • Используйте JQ для генерации CSV из поиска ножей
  • получить mysql число id в сценарии оболочки
  • Есть ли отдельный инструмент, который будет записывать отчеты из файлов данных CSV
  • Возможно ли напечатать повторяющийся диапазон аргументов через cli из csv? (см. пример)
  • Вычислять хиты в течение промежутка времени из файла журнала
  • Удаление лишних пробелов, но не новая строка из csv-файлов
  • Как найти и заменить новую строку?
  • Как я могу получить и сравнить два значения из файла?
  • One Solution collect form web for “Соответствие 3 или более слов из полей в отдельных файлах csv”

    Может быть больше shell-centric решение (awk?), Но я обычно обращаюсь к perl когда проблема становится такой сложной. Вот скрипт perl, который считывает все csv2 в память, собирая строки в виде ключей в хеш, значениями которых являются соответствующие заголовки.

    Затем он перебирает csv1 , вытягивает заголовок, затем для каждого заголовка из csv2 подсчитывает количество раз, когда csv2 каждое слово в названии. Если это более чем desired , то печатается соответствующий заголовок вместе с его «исходной» строкой из csv1 .

     #!/usr/bin/env perl my @csv2 = (); open CSV2, "<csv2" or die; @csv2=<CSV2>; close CSV2; my %csv2hash = (); for (@csv2) { chomp; my ($title) = $_ =~ /^.+?,\s*([^,]+?),/; #/ match the title $csv2hash{$_} = $title; } open CSV1, "<csv1" or die; while (<CSV1>) { chomp; my ($title) = $_ =~ /^.+?,\s*([^,]+?),/; #/ match the title my @titlewords = split /\s+/, $title; #/ get words my $desired = 3; my $matched = 0; foreach my $csv2 (keys %csv2hash) { my $count = 0; my $value = $csv2hash{$csv2}; foreach my $word (@titlewords) { ++$count if $value =~ /\b$word\b/i; last if $count >= $desired; } if ($count >= $desired) { print "$csv2\n"; ++$matched; } } print "$_\n" if $matched; } close CSV1; 
    Linux и Unix - лучшая ОС в мире.