perl - 如何提取多个文件中的公共(public)行?

标签 perl shell grep comm

我有 15 个不同的文件,我想要一个新文件,其中所有文件中只包含公共(public)行。例如:

File1:

id1
id2
id3

file2:

id2
id3
id4

file3:
id10
id2
id3

file4

id100
id45
id3
id2

I need the output be like:

newfile:

id2 
id3

我知道这个命令适用于每对文件:

grep -w -f file1 file2 > 输出

但我需要一个命令来处理 2 个以上的文件。

请问有什么建议吗?

最佳答案

Perl 来救援:

perl -lne 'BEGIN { $count = @ARGV }
           $h{$_}{$ARGV} = 1;
           }{
           print $_ for grep $count == keys %{ $h{$_} }, keys %h
           ' file* > newfile
  • -n 逐行读取输入文件
  • -lprint 中添加换行符
  • @ARGV 数组包含输入文件名,在 BEGIN 处将其分配给 $count 只是对它们进行计数
  • $ARGV 包含当前输入文件的名称
  • $_ 包含从文件中读取的当前行。
  • %h 哈希包含 id 作为键,每个键包含一个哈希引用,其中文件名包含 id 作为键
  • }{ 是“爱斯基摩问候语”运算符,它引入了在输入耗尽后运行的代码
  • 我们只输出文件数量等于所有文件数量的 id。它适用于任意数量的文件。

关于perl - 如何提取多个文件中的公共(public)行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37127046/

相关文章:

linux - 尝试使用 cp 将文件复制到多个文件时出错

string - 从字符串中删除所有出现的单词

bash - 如何在不转义的情况下grep星号?

regex - 如何使用 Perl 检查标量中是否包含已编译的正则表达式?

linux - Shell:将标准输出重定向到/dev/null,将标准错误重定向到标准输出

linux - 统计最近 7 天内文件中出现的次数

log4j - 堆栈跟踪的 grep 友好日志记录

Perl 打包和解包函数

perl - 为什么这个 Perl 洗牌函数不洗牌?

perl - 在 Mojo::UserAgent 中设置 Referer header