使用多种模式显示多行
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 PATTERN
s 的集合
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
希望您能阐明我的一个要求。假设我有包含以下条目的文件:
美国广播公司 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=]
)
- 如果我们在 ABC 线上,则换行符 (
grep
然后运行您的查询。这使您可以使用-f FILE_OF_PATTERNS
或-e PATTERN
s 的集合
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