我在一个文本文件中有一个很长的模式列表,每行一个项目。我使用的是旧版本的Solaris Unix,所以我必须在命令行中使用egrep,因为我的脚本编写经验非常有限。我正在搜索的文件中有每个模式的许多示例。我只想返回每个模式 * 的第一个示例 * 中的行
$ cat patterns.txt
p1
p2
p3
$ cat target.txt
p1
p3
p1
p1
p3
p2
p3
p2
p1
获取整个匹配列表的命令是
egrep -f patterns.txt target.txt
我已经找到了许多示例来说明如何只返回列表中模式的第一行,或者返回第一行和最后一行,我需要的是返回patterns.txt中每个模式的第一行到target.txt中
我已经尝试过使用awk和sed修改示例(如下所示),但是我对这些命令及其用法不是很熟悉,所以我可能做错了。
awk 'BEGIN { while(getline<"patterns.txt") M[$1]=1 }; { if(M[$1]==1) { print; M[$1]=2 } }' target.txt
egrep -f patterns.txt target.txt | sed -n '1p;$p'
最后一个生成了target.txt文件中匹配的第一个模式和最后一个模式,我认为这是朝着正确的方向前进,但是我对sed的理解还不够好,无法正确获得参数。
2条答案
按热度按时间s6fujrry1#
仅仅基于OP提供的数据,看起来我们只能匹配整行。
一个
awk
创意:这将产生:
当然,我们不能仅仅从这个输出中判断出我们匹配了 * 哪 * 行,所以为了调试的目的,我们将向混合中添加一个显式的
print
,以包括输入行号:ego6inou2#
这可能对您有用(GNU sed):
从模式文件生成一个sed脚本,并使用目标文件将该脚本应用于sed的第二次调用。