在模式文件中使用grep:打印单个和重复条目
让我先说我不想只打印重复的行,也不想删除它们 我正在尝试将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
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
执行该任务。我已经更新了代码并对旧行为进行了注释。下次试着从一开始就给出准确的需求,因为每次都为这些小修改修改脚本是不好的。