如何让Awk匹配的多行记录输出以空行分隔?
问题描述
我参考了处理多行记录的awk示例,现在需要从包含多家餐厅信息的多行记录中筛选出位于Columbus的餐厅。当前用awk命令筛选后,匹配的记录是连在一起的,希望每个匹配的餐厅记录之间用空行分隔,调整FS和ORS参数后仍未解决。
输入数据
Restaurant: Chik-Fil-A City: Columbus State: GA Address: 123 Biscayne Blvd Phone: 911 Restaurant: 5 guys City: Columbus State: GA Address: 123 Peachtree Rd Phone: 911 Restaurant: KFC City: NYC State: NY Address: 123 Madison Square Phone: 911 Restaurant: Bahama Breeze City: Orlando State: FL Address: 123 Madison Square Phone: 911
当前使用命令
awk -v name="Columbus" -v RS="" '$0 ~ "City: " name' file.txt
当前输出
Restaurant: Chik-Fil-A City: Columbus State: GA Address: 123 Biscayne Blvd Phone: 911 Restaurant: 5 guys City: Columbus State: GA Address: 123 Peachtree Rd Phone: 911
期望输出
Restaurant: Chik-Fil-A City: Columbus State: GA Address: 123 Biscayne Blvd Phone: 911 Restaurant: 5 guys City: Columbus State: GA Address: 123 Peachtree Rd Phone: 911
解决方案
问题出在设置RS=""时,awk会把空行分隔的内容视为单个记录,但默认的ORS(输出记录分隔符)是单个换行符,导致匹配的记录直接连在一起输出。只需在命令中显式设置ORS="\n\n",让每个匹配的记录输出后添加一个空行即可:
awk -v name="Columbus" -v RS="" -v ORS="\n\n" '$0 ~ "City: " name' file.txt
逻辑说明:
RS="":将空行作为记录分隔符,把每家餐厅的信息划分为独立记录ORS="\n\n":设置输出记录分隔符为两个换行,确保匹配的餐厅记录间用空行分隔$0 ~ "City: " name:筛选出包含指定城市的记录并输出
执行后就能得到期望的输出格式。
内容的提问来源于stack exchange,提问作者larryTheLamb
相关产品推荐
相关产品推荐

