使用多种模式显示多行

Display multiple lines using multiple patterns

希望您能阐明我的一个要求。假设我有包含以下条目的文件:

美国广播公司 123
XYZ 789
XYZ 456
美国广播公司 234
XYZ 789
美国广播公司 567
XYZ 789
XYZ 678
XYZ 123

基本上,我有 ABC 行,后面有 X 行 XYZ 行。每个 ABC 中的 XYZ 记录数从 1 到许多不等。

我需要一个 shell 脚本来根据第二列中的模式输出 ABC 和相应的 XYZ。

例如,显示模式为 567 的 ABC 记录和模式为 678 的相应 XYZ 记录。

输出应该仅为:

美国广播公司 567
XYZ 678

如果适合您,请试试这个。我希望我理解你的要求:

 awk -v p1='ABC 567' -v p2='XYZ 678' 
       '[=10=]~p1{t=1;print;next}/^ABC/{t=0}[=10=]~p2&&t' file

为了解决这个问题,我使用 awk 将数据整理成一行,然后在该输出上使用 grep,然后 sed 将匹配的条目恢复为原始格式。

awk '{ printf ( == "ABC" ? "\n" : " @¶@ ") [=10=] }' file |grep 567 |sed 's/ @¶@ /\n/g'

代码遍历:

  • 我用 @¶@ 作为分隔符。使用不会在您的数据中发生冲突的内容(否则您将不得不处理转义它)。另请注意,您的 UTF8 支持里程可能会有所不同。
  • awk 打印,没有尾随换行符,两个东西连接在一起:
    • 如果我们在 ABC 线上,则换行符 (\n)。否则,分隔符 (@¶@).
    • 然后现有行([=19=])
  • grep 然后运行您的查询。这使您可以使用 -f FILE_OF_PATTERNS-e PATTERNs
  • 的集合
  • sed 然后将分隔符恢复为原始格式

这样做的好处是可以逐行进行。如果你在一个 ABC 中有数万个 XYZ,它会有点慢,但这不会在内存中保留任何东西,所以这应该是相当可扩展的。

下面是上述awk命令的输出(是的,有一个前导空行,这无关紧要):

$ awk '{ printf ( == "ABC" ? "\n" : " @¶@ ") [=11=] }' file

ABC 123 @¶@ XYZ 789 @¶@ XYZ 456
ABC 234 @¶@ XYZ 789
ABC 567 @¶@ XYZ 789 @¶@ XYZ 678 @¶@ XYZ 123