在模式文件中使用grep:打印单个和重复条目

在模式文件中使用grep:打印单个和重复条目,grep,duplicate-data,line-breaks,no-match,Grep,Duplicate Data,Line Breaks,No Match,让我先说我不想只打印重复的行,也不想删除它们 我正在尝试将grep与一个模式文件一起使用,以解析一个大型数据文件 例如,模式文件可能如下所示: 1243 1234 1234 1234 1354 1356 1356 1677 aatta 1243 qqqqqq yyyyy 1234 vvvvvv ttttt 1555 bbbbbb ppppp 1354 pppppp yyyyy 3333 zzzzzz qqqqq 1677 eeeeee

让我先说我不想只打印重复的行,也不想删除它们

我正在尝试将grep与一个模式文件一起使用,以解析一个大型数据文件

例如,模式文件可能如下所示:

1243
1234
1234
1234
1354
1356
1356
1677
aatta   1243    qqqqqq
yyyyy   1234    vvvvvv
ttttt   1555    bbbbbb
ppppp   1354    pppppp
yyyyy   3333    zzzzzz
qqqqq   1677    eeeeee
iiiii   4444    iiiiii
等等,具有更多的单个和重复条目

输入数据文件可能如下所示:

1243
1234
1234
1234
1354
1356
1356
1677
aatta   1243    qqqqqq
yyyyy   1234    vvvvvv
ttttt   1555    bbbbbb
ppppp   1354    pppppp
yyyyy   3333    zzzzzz
qqqqq   1677    eeeeee
iiiii   4444    iiiiii
等27000条线路

当我使用

grep -f 'Patternfile.txt' 'Inputfile.txt' > 'Outputfile.txt'
我得到的输出文件类似于:

aatta   1243    qqqqqq
yyyyy   1234    vvvvvv
ppppp   1354    pppppp
我怎样才能让它也报告副本,这样我就可以得到这样的结果呢

aatta   1243    qqqqqq
yyyyy   1234    vvvvvv
yyyyy   1234    vvvvvv
yyyyy   1234    vvvvvv
ppppp   1354    pppppp


qqqqq   1677    zzzzzz
此外,如果模式文件中的查询与输入文件中的子字符串不匹配,我还希望打印一个空行


谢谢大家!

一种解决方案,不是使用
grep
,而是使用
perl

使用
patternfile.txt
inputfile.txt
以及原始帖子的数据。
script.pl
的下一个内容应该完成这项工作(我假设要匹配的字符串是第二列,否则应该修改为使用
regexp
。这种方法更快):

并给出下一个输出:

aatta   1243    qqqqqq
yyyyy   1234    vvvvvv
yyyyy   1234    vvvvvv
yyyyy   1234    vvvvvv
ppppp   1354    pppppp


qqqqq   1677    eeeeee

与其说您是在为模式添加grep,不如说您是在将输入中的数据加入到模式中的数据

您可以(大部分)通过
join
来实现这一点,自从我尝试解决类似于您的问题以来,我就非常熟悉这一方便的Unix实用程序

不过,也有一些小差异

首先命令:

join -a 1 -2 2 <(sort Patternfile.txt) <(sort -k2,3 Inputfile.txt)
1234 yyyyy vvvvvv
1234 yyyyy vvvvvv
1234 yyyyy vvvvvv
1243 aatta qqqqqq
1354 ppppp pppppp
1356
1356
1677 qqqqq eeeeee
差异

指定输出与此结果之间存在细微差异:

  • 它是按键顺序排序的
  • 不可连接的行仍包含其原始键。如果出现问题,您可以通过简单的
    awk
    ,清除不匹配的行:

    ... | awk '{ if ($2 != "") print; else print ""  }'
    

谢谢,这很接近。。我还试图让它打印一个空白行,如果没有找到模式。但到目前为止,这已经帮了大忙了@政治朋友:你觉得空行怎么样?将其添加到您的问题中以获得帮助。我也会试试。嗯,有趣的风格是
qq[]
:)@Birei我可以问你哪些变量索引了不存在的值吗?我还在调试,如果找不到重复的模式,只打印一行而不是重复的空行。@puropolicFriend:你又更改了原始问题的输入和输出。我已经更新了答案。最后一个
else
执行该任务。我已经更新了代码并对旧行为进行了注释。下次试着从一开始就给出准确的需求,因为每次都为这些小修改修改脚本是不好的。