Shell 适用于'的awk;任何';(文件1)中的字符(文件2)
对于(文件1)和(文件2)中的文件名中包含的任何字符,awk的最佳方法是什么 迄今为止的代码:Shell 适用于'的awk;任何';(文件1)中的字符(文件2),shell,variables,awk,Shell,Variables,Awk,对于(文件1)和(文件2)中的文件名中包含的任何字符,awk的最佳方法是什么 迄今为止的代码: $ sed -e 's/.*\ -\ //' -e 's/.mp3$//' File1.txt | while read z; do tit="$z" ; awk -v title="$tit" '{FS = "\t"} $2 ~ title {print $0}' File2.txt ; done 结果; 它正在工作,除非它在文件名中以(的形式)点击文件 我试着引用我能想到的所有东西,但还是没有运
$ sed -e 's/.*\ -\ //' -e 's/.mp3$//' File1.txt | while read z; do tit="$z" ; awk -v title="$tit" '{FS = "\t"} $2 ~ title {print $0}' File2.txt ; done
结果;
它正在工作,除非它在文件名中以(的形式)点击文件
我试着引用我能想到的所有东西,但还是没有运气
文件1:命名为“播放列表”,分隔符为:“-”
- 彼得·托什-那果阿监狱(奖励曲目).mp3
- 彼得·托什·纳果阿监狱32000/音乐/彼得·托什/彼得·托什-纳果阿监狱(Bonus Track.mp3)
sed -e 's/.*\ -\ //' -e 's/.mp3$//' File1.txt | while IFS='\n' read z; do grep "$z" File2.txt; done
请注意,循环使用了IFS(内部字段分隔符),默认为空格。+1表示出色的第一篇文章,但…;-)请添加您的预期输出。(输入和输出在格式化为代码时更易于阅读)。祝您好运。只需使用
-F“\t”
或开始{FS=“\t”}设置一次字段分隔符
而不是每次读一行。谢谢。你们中的任何一位可以更正我使用的代码(awk)来忽略文件名中的字符()-$%#@!吗?在我的示例中,我在文件2中搜索歌曲名“Peter Tosh-Reggae Party(Bonus).mp3”。如果匹配,将在文件2中返回整行。括号(可能还有其他角色)正在绊倒awk。我需要将awk用作一行程序。谢谢。您的方法行不通,因为您使用$z作为正则表达式(使用~)。在这种情况下,您应该在awk中转义这些特殊字符,但这将导致较长的“一行”。如果您在awk的一行中解释更多您想要完成的任务以及为什么必须完成这些任务,将更容易为您提供帮助。我编辑了原始帖子以解释更多内容。谢谢。请参阅上文。
awk 'NR == FNR { artist[$1,$2]=1 ; next } #Load the artiest/title file
NR != FNR { if( artist[$1,$2] ) { print $4 } #Check if artiest,title was loaded
else { print "no match" } }' artist-title artist-title-bitrate-path