Awk 如何在同一行中打印匹配行?

Awk 如何在同一行中打印匹配行?,awk,Awk,使用此awk脚本,我可以在匹配模式后打印第n行 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/{

使用此awk脚本,我可以在匹配
模式后打印第n行

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

如何做到这一点?提前感谢

使用printf代替总是添加ORS的打印:

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}'

有了您展示的样品,请尝试以下内容。使用GNU
awk
中显示的样本编写和测试。我还使用了
exit
,以防您使用输入文件从中读取值,在这种情况下会有所帮助

your_variable | 
awk ' /^Date:/{val=$0;next} /^val/ && ++count==3{print val" - "$0;exit}'
以OP的方式尝试:

your_variable | 
awk ' /^Date:/{val=$0;next} /^Time/{found=1;next} found && ++count==3{print val" - "$0;exit}'
另一个类似的

... | awk '/Date/ {printf "%s - ",$0}
           /Time/ {c=4} 
           c&&!--c'

相关:更改为
printf
不需要
%s
,非常感谢。我不是专家,但我选择了你的答案,因为我觉得它更容易。@AvenDesta如果你指的是
printf d
vs
printf“%s”,d
-对于任何用户输入,永远不要做
printf任何事,因为它会失败crypticall如果/当输入包含像
%s
这样的printf格式字符时,总是做
printf“%s”,不管怎样,谢谢你的解决方案。很好,但是第三行并不总是以
Val
开头,或者第1行、第2行、第3行可以有不同的文本。不可变字符串将始终是字符串
时间
,并取其下的第三个。@GerCas,当然,已经(几秒前左右)添加了您尝试的代码的改进答案,干杯:)感谢您的解决方案。为什么它在代码c=4而不是c=3中也能工作?因为我改变了顺序,它也会随着时间计算行数。