0

我有一个包含电影列表的输入文件(请注意,可能有一些重复的条目):

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

基本上,两个文件中的条目的区别在于,一些字符如:空格、括号、点等都被下划线代替了。

有人可以解释一下吗?

最好的祝愿,

哈维尔

4

3 回答 3

1

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/

于 2010-06-15T14:37:45.910 回答
0

也许您可以使用 sed 去除所有不需要的字符(来自文件列表和文本文件)?

例如


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

或者,如果您想要更多的模糊性,您可以尝试对已处理的文件名(或标记化版本)做一些最小的编辑距离。

于 2010-06-15T09:19:43.620 回答
0

试试这个。它不会特别快:

#!/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
于 2010-06-15T12:40:11.670 回答