使用这个 awk 脚本,我可以在 match 之后打印第 N 行Pattern。
awk '/c&&!--c;/Pattern/{c=N}'
Run Code Online (Sandbox Code Playgroud)
现在,我试图在匹配时打印该行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
Run Code Online (Sandbox Code Playgroud)
该脚本打印我想要的但在不同的行中,我想像这样在同一行中打印输出
Date:2/19/2021 - val:16:28:03
Run Code Online (Sandbox Code Playgroud)
如何才能做到这一点?提前致谢
而不是总是添加 ORS 的打印,而是使用 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}'
Run Code Online (Sandbox Code Playgroud)
传递给 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}'
Run Code Online (Sandbox Code Playgroud)
使用您显示的样本,请尝试以下操作。使用 GNU 中显示的示例编写和测试awk。exit如果您使用 Input_file 从中读取值,我也使用过,在这种情况下它会有所帮助。
your_variable |
awk ' /^Date:/{val=$0;next} /^val/ && ++count==3{print val" - "$0;exit}'
Run Code Online (Sandbox Code Playgroud)
用 OP 的方式尝试:
your_variable |
awk ' /^Date:/{val=$0;next} /^Time/{found=1;next} found && ++count==3{print val" - "$0;exit}'
Run Code Online (Sandbox Code Playgroud)
另一个类似的
... | awk '/Date/ {printf "%s - ",$0}
/Time/ {c=4}
c&&!--c'
Run Code Online (Sandbox Code Playgroud)