Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
Perl Unix-文件名和字符串结果在同一行_Perl_Unix_Grep - Fatal编程技术网

Perl Unix-文件名和字符串结果在同一行

Perl Unix-文件名和字符串结果在同一行,perl,unix,grep,Perl,Unix,Grep,我需要搜索一个目录,该目录包含数百或数千个文件,每个文件包含一个或多个特定字符串实例(带数据的开始/结束标记)的XML。 我可以通过执行以下操作获得字符串的所有实例 grep -ho '<mytagname>..............<\/mytagname>' /home/xyzzy/mydata/*.XML > /home/mydata/tagvalues.txt (等) 理想情况下,我希望文件的每一行都包含文件名,以便导入数据库进行分析 所以我的结果是这样

我需要搜索一个目录,该目录包含数百或数千个文件,每个文件包含一个或多个特定字符串实例(带数据的开始/结束标记)的XML。 我可以通过执行以下操作获得字符串的所有实例

grep -ho '<mytagname>..............<\/mytagname>' /home/xyzzy/mydata/*.XML > /home/mydata/tagvalues.txt
(等)

理想情况下,我希望文件的每一行都包含文件名,以便导入数据库进行分析

所以我的结果是这样的

fileAAA value001
fileAAA value002
fileAAA value003
fileBBB value004
上述内容的精确格式是灵活的,可以使用空格或其他分隔符,甚至还可以包含开始/结束标记

我能得到的最接近的是grep-o

fileAAA:value001
value002
value003
fileBBB:value004
perl一行程序似乎很理想,但我对这方面还很陌生,不知道如何开始

awk -F'</?mytagname>' '$2 {print FILENAME,$2}' /home/xyzzy/mydata/*.XML
awk-F''$2{打印文件名,$2}'/home/xyzy/mydata/*.XML
说明:

  • -F regex
    -set字段分隔符必须是一个单独的参数,因此包含在它自己的引号中
  • $2
    -如果第二个字段有值
  • {print FILENAME,$2}
    -print FILENAME空格第二个字段的值
    • awk呢

      awk -F'</?mytagname>' '$2 {print FILENAME,$2}' /home/xyzzy/mydata/*.XML
      
      awk-F''$2{打印文件名,$2}'/home/xyzy/mydata/*.XML
      
      说明:

      • -F regex
        -set字段分隔符必须是一个单独的参数,因此包含在它自己的引号中
      • $2
        -如果第二个字段有值
      • {print FILENAME,$2}
        -print FILENAME空格第二个字段的值

      可以使用如下所示的单层衬里:

      perl -lne 'print "$ARGV $1" if /<mytagname>(.*?)<\/mytagname>/' *.xml
      

      可以使用如下所示的单层衬里:

      perl -lne 'print "$ARGV $1" if /<mytagname>(.*?)<\/mytagname>/' *.xml
      

      谢谢-这两个(perl和awk)都在某种程度上起作用:它们似乎只接受文件中第一个出现的字符串。当我使用我原来的grep时,我得到了成千上万的点击率(即使在我排序并获取唯一值之后)。当我按原样使用这两个命令中的任何一个时,我得到了大约7500个点击数,这是目录中的文件数。啊哈-做了一些挖掘,在另一篇文章中找到了答案-因此我将perl命令改为while(/(.*)/g)”,而不是if-这给了我一个更可信的数字。谢谢-这两个(perl和awk)在某种程度上起作用:它们似乎只接受文件中字符串的第一次出现。当我使用我原来的grep时,我得到了成千上万的点击率(即使在我排序并获取唯一值之后)。当我按原样使用这两个命令中的任何一个时,我得到了大约7500个点击,这是目录中的文件数。啊哈-做了一些挖掘,在另一篇文章中找到了答案-因此我将perl命令改为while(/(.*)/g)'而不是if-这给了我一个更可信的数字。