【问题标题】:Awk pattern matching: looping through occurrences, appending textawk 模式匹配:循环出现,附加文本
【发布时间】:2015-08-16 02:40:03
【问题描述】:

我在一个文本文件中循环浏览电台名称。对于文本文件中的每个站块,我想匹配第一次出现的“添加”并使用来自该站块的适当传感器和时间信息附加一个关闭语句。如果该站存在第二个传感器,我还想在第二次出现“添加”之后附加一个关闭语句,使用它的适当传感器和相同的时间信息。如果第二个传感器不存在,它可以移动到下一个站点。我想在文本文件中的每个站块中都遵循这种模式。我用 awk 和 sed 尝试了一些东西,但我只能在每次出现“add”之后添加 close 语句。谁能指导我采用更合适的技术?这是文本文件中的两个示例站块:

 sta charlie 34.07335 -106.91932 1.43 topico
 time 01/14/2015 23:05:38
 net XI SPREE
 datalogger q330 0100000EA9C2B9C3 # 2842
 sensor cmg3t 0 T3S82
 add

 sensor trillium 0 T3N04
 add
 #######Next station block###############

 sta charlie2 34.07335 -106.91932 1.43 topico2
 time 01/14/2015 23:05:38
 net XI SPREE
 datalogger q330 0100000EA9C2B9C3 # 2842
 sensor trillium 0 T3S84
 add

 sensor sts2 0 T3N04
 add

我希望代码输出以下内容:

 sta charlie 34.07335 -106.91932 1.43 topico
 time 01/14/2015 23:05:38
 net XI SPREE
 datalogger q330 0100000EA9C2B9C3 # 2842
 sensor cmg3t 0 T3S82
 add
 close sensor cmg3t 01/14/2015 23:05:38

 sensor trillium 0 T3N04
 add
 close sensor trillium 01/14/2015 23:05:38
 #######Next station block###############

 sta charlie2 34.07335 -106.91932 1.43 topico2
 time 01/23/2015 17:04:22
 net XI SPREE
 datalogger q330 0100000EA9C2B9C3 # 2842
 sensor trillium 0 T3S84
 add
 close sensor trillium 01/23/2015 17:04:22

 sensor sts2 0 T3N04
 add
 close sensor sts2 01/23/2015 17:04:22

【问题讨论】:

  • 我将它精简到只有必要的组件。我只是不希望有人使用行号编写解决方案,因为中间还有其他条目。感谢您考虑

标签: regex bash awk sed


【解决方案1】:

这样的事情听起来像你想要的,但我知道当所有输入的日期都是 1/14 时,你发布的输出中的日期如何变成 1/23:

$ awk '/^time/{time=$2" "$3} /^sensor/{sensor=$1" "$2} {print} /^add/{print "close", sensor, time}' file
sta charlie 34.07335 -106.91932 1.43 topico
time 01/14/2015 23:05:38
net XI SPREE
datalogger q330 0100000EA9C2B9C3 # 2842
sensor cmg3t 0 T3S82
add
close sensor cmg3t 01/14/2015 23:05:38

sensor trillium 0 T3N04
add
close sensor trillium 01/14/2015 23:05:38
#######Next station block###############

sta charlie2 34.07335 -106.91932 1.43 topico2
time 01/14/2015 23:05:38
net XI SPREE
datalogger q330 0100000EA9C2B9C3 # 2842
sensor trillium 0 T3S84
add
close sensor trillium 01/14/2015 23:05:38

sensor sts2 0 T3N04
add
close sensor sts2 01/14/2015 23:05:38

【讨论】:

  • 工作就像一个魅力 Ed,非常感谢!我没想到这会是一个如此简单的解决方案。我对 awk 还比较陌生,我相信我了解这里的所有内容,但是如果您不介意稍微解释一下解决方案,那就太好了。感谢您的帮助!
  • 它只是保存以时间和传感器开头的行的信息,并在以 add 开头的行之后打印它们。您有什么具体问题吗?
  • 所以它需要时间值并节省 $2 和 $3,然后获取传感器条目 $1 和 $2,打印它们并在每个“添加”语句后附加短语“关闭”。这是说明它在做什么的正确方式吗?
猜你喜欢
  • 2016-08-27
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多