Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 适用于'的awk;任何';(文件1)中的字符(文件2)_Shell_Variables_Awk - Fatal编程技术网

Shell 适用于'的awk;任何';(文件1)中的字符(文件2)

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 结果; 它正在工作,除非它在文件名中以(的形式)点击文件 我试着引用我能想到的所有东西,但还是没有运

对于(文件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
结果; 它正在工作,除非它在文件名中以(的形式)点击文件

我试着引用我能想到的所有东西,但还是没有运气

文件1:命名为“播放列表”,分隔符为:“-”

  • 彼得·托什-那果阿监狱(奖励曲目).mp3
文件1字段为:“艺术家”“标题”

File2:命名为“主列表”,分隔符为:tab

  • 彼得·托什·纳果阿监狱32000/音乐/彼得·托什/彼得·托什-纳果阿监狱(Bonus Track.mp3)
文件2字段为:“艺术家”“标题”“比特率”“路径”

使用上述示例…针对“播放列表”中的每个条目

  • 使用“播放列表”为Field1和Field2(艺术家标题)生成2个变量
  • 在主列表中搜索$title“Na Goa监狱(奖励曲目).mp3”
  • 如果匹配,请检查$artist是否也匹配
  • 如果$title和$artist匹配,则打印主列表中的第四列,否则打印“不匹配”
  • 您可以通过执行以下操作获得相同(且更简单)的结果:

    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