сопоставление файлов с регулярными выражениями - PullRequest
0 голосов
/ 15 июня 2010

У меня есть входной файл со списком фильмов (обратите внимание, что могут быть некоторые повторяющиеся записи):

American_beauty__1h56mn38s_
As_Good_As_It_Gets
As_Good_As_It_Gets
_DivX-ITA__Casablanca_M_CURTIZ_1942_Bogart-bergman_
Capote_EN_DVDRiP_XViD-GeT-AW
_DivX-ITA__Casablanca_M_CURTIZ_1942_Bogart-bergman_

Я хотел бы найти соответствующее совпадение (номер строки) из другого эталонного файла для каждогоиз записей в первом файле:

American beauty.(1h56mn38s)
As Good As It Gets
Capote.EN.DVDRiP.XViD-GeT-AW
[DivX-ITA] Casablanca(M.CURTIZ 1942 Bogart-bergman)
Quills (2000)(7.4) 

Желаемый результат будет выглядеть примерно так (Ссылочный фильм + номер строки из справочного файла):

American beauty.(1h56mn38s) 1
As Good As It Gets 2
As Good As It Gets 2
[DivX-ITA] Casablanca(M.CURTIZ 1942 Bogart-bergman) 4
Capote.EN.DVDRiP.XViD-GeT-AW 3
[DivX-ITA] Casablanca(M.CURTIZ 1942 Bogart-bergman) 4

По сути, разница междузаписи в обоих файлах состоят в том, что некоторые символы, такие как: пробелы, скобки, точки и т. д., были заменены символами подчеркивания.

Кто-нибудь может пролить на него свет?

С наилучшими пожеланиями

Хавьер

Ответы [ 3 ]

1 голос
/ 15 июня 2010

Awk будет работать:

gawk '
  NR == FNR {
    # read the reference file first, capture the line numbers and transform
    # the "real" title to one with underscores
    line[$0] = NR
    u = $0
    gsub(/[][ .()]/,"_",u)
    movie[u] = $0
    next
  }
  $0 in movie {
    print movie[$0] " " line[movie[$0]]
  }
' movies.reference movies.list

Регулярное выражение можно было бы упростить, если бы дефисы были также превращены в подчеркивания (тогда /\W/).

0 голосов
/ 15 июня 2010

Дайте это попробовать. Это не будет особенно быстро:

#!/bin/bash
chars='[]() .'
num=0
while read -r line
do
    (( num++ ))
    num=$( grep --line-number "$line" <( tr "$chars" '_' < movies.reference ) | awk -F: '{print $1}' )
    echo "$( sed -n "$num{p;q}" movies.reference ) $num"
done < movies.input
0 голосов
/ 15 июня 2010

Может быть, вы могли бы просто удалить все ненужные символы (как из списка файлов, так и из текстового файла), используя sed?

например,


ls | sed -e 's/[^a-z0-9]/o/gi'

Или, если вы хотите больше нечеткости, выможет попытаться выполнить наименьшее расстояние редактирования обработанного имени файла (или версии с токенами).

...