首页 > 解决方案 > 如何在同一行中打印匹配的行?

问题描述

使用这个 awk 脚本,我可以在 match 之后打印第 N 行Pattern

awk '/c&&!--c;/Pattern/{c=N}'

现在,我正在尝试在匹配时打印该行并在匹配Date后打印第三行Time

echo "x
Date:2/19/2021
a
b
Time:
val:14:31:42
val:15:51:35
val:16:28:03
val:17:04:11
z
w" | 
awk '/Date/{d=$0} 
      c&&!--c;/Time/{print d " - "; c=3}'

Date:2/19/2021
val:16:28:03

该脚本打印我想要的但在不同的行中,我想像这样在同一行中打印输出

Date:2/19/2021  -  val:16:28:03

如何才能做到这一点?提前致谢

标签: awk

解决方案


而不是总是添加 ORS 的 print ,而是使用 printf :

echo "x
Date:2/19/2021
a
b
Time:
val:14:31:42
val:15:51:35
val:16:28:03
val:17:04:11
z
w" |  awk '/Date/{d=$0}
      c&&!--c;/Time/{printf d " - "; c=3}'

传递给 printf 的第一个参数是格式字符串。如果格式字符串包含一个百分号,整个事情就会中断,因为当百分号出现在格式字符串中时,printf 将它们视为特殊的。

在您的特定情况下,日期永远不会有百分号,但如果您使用此方法打印其他没有换行符的字符串,则需要提供与您正在打印的参数分开的格式字符串:

echo "x
Date:2/19/2021
a
b
Time:
val:14:31:42
val:15:51:35
val:16:28:03
val:17:04:11
z
w" |  awk '/Date/{d=$0}
      c&&!--c;/Time/{printf "%s - ", d; c=3}'

推荐阅读