我有一个包含电影列表的输入文件(请注意,可能会有一些重复的条目):
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
基本上,两个文件中条目之间的区别在于,某些字符如:空格,括号,点等已被下划线替换。
有人能说清楚吗?
祝福,
哈维尔
答案 0 :(得分: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/
),则可以简化正则表达式。
答案 1 :(得分:0)
也许你可以使用sed剥离所有不需要的字符(来自文件列表和文本文件)?
e.g
ls | sed -e 's/[^a-z0-9]/o/gi'
或者如果你想要更多的模糊性,你可以尝试在处理过的文件名(或标记化版本)上做一些编辑距离。
答案 2 :(得分: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