【问题标题】:How to print matched lines in same line?如何在同一行中打印匹配的行?
【发布时间】:2021-05-23 00:45:50
【问题描述】:

使用这个 awk 脚本,我可以在匹配 Pattern 之后打印第 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

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

【问题讨论】:

标签: awk


【解决方案1】:

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

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

【讨论】:

  • 不需要%s
  • 非常感谢。我不是专家,但我选择了你的答案,因为我觉得它更容易。
  • @AvenDesta 如果您指的是printf dprintf "%s", d - 永远不要为任何用户输入使用printf whatever,因为如果/当输入包含诸如@ 之类的 printf 格式字符时,它将失败密码987654327@,总是改用printf "%s", whatever
【解决方案2】:

使用您展示的示例,请尝试以下操作。使用 GNU awk 中的示例编写和测试。我还使用了exit,以防您使用 Input_file 从那时读取值,这样会有所帮助。

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

【讨论】:

  • 感谢您的解决方案。很好,但第 3 行并不总是以 Val 开头,或者第 1、第 2、第 3 行可以有不同的文本。不变的字符串将始终是字符串Time 并得到它的第三个。
  • @GerCas,当然,已经(大约几秒后)添加了您尝试的代码对答案的改进,干杯:)
【解决方案3】:

另一个类似的

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

【讨论】:

  • 感谢您的解决方案。为什么它甚至在您的代码 c=4 而不是 c=3 中也有效?
  • 因为我改变了顺序,它也计算了时间的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 2011-06-20
  • 2015-04-14
  • 1970-01-01
相关资源
最近更新 更多