如何在同一行打印匹配的行?

Ger*_*Cas 3 awk

使用这个 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)

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

Jer*_*iah 5

而不是总是添加 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)

  • @AvenDesta 如果您指的是 `printf d` 与 `printf "%s", d` - 切勿对任何用户输入执行 `printfwhatever`,因为如果/当输入包含 printf 格式字符(如 `)时,它会失败 cryptocall %s`,总是执行`printf "%s",whatever`。 (5认同)

Rav*_*h13 5

使用您显示的样本,请尝试以下操作。使用 GNU 中显示的示例编写和测试awkexit如果您使用 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)


kar*_*kfa 5

另一个类似的

... | awk '/Date/ {printf "%s - ",$0}
           /Time/ {c=4} 
           c&&!--c'
Run Code Online (Sandbox Code Playgroud)