【问题标题】:Parse unstructured data in shell在 shell 中解析非结构化数据
【发布时间】:2015-01-12 11:04:34
【问题描述】:

我要解析以下文件:

0.9103726 = (MATCH) sum of:
0.0050276485 = (PHRASE) title:abc
0.9323103726 = (MATCH) sum of:
0.1323103726 = (MATCH) mul of:
0.185 = (PHRASE) title:xyz
0.9103726 = (MATCH) sum of:
0.234 = (PHRASE) title:bcd

我想要的输出是这样的:

0.0050276485 -- title -- abc
0.185 -- title -- xyz
0.234 -- title -- bcd

我试过的命令是这样的:

grep -oP '[\d.]+(?==(PHRASE)title:?)'

但它没有给我正确的输出。 很抱歉之前的问题。不清楚。

【问题讨论】:

  • 你的正则表达式不起作用的原因是括号在 Perl 正则表达式中不匹配;使用\(PHRASE\) 从字面上匹配带括号的表达式。此外,title: 之前需要一个空格才能匹配。但最后,grep 无法解析任何内容,只需打印匹配的行或子字符串。

标签: linux shell parsing grep


【解决方案1】:

如果你想要的是= 之前的第一个元素和: 之后的最后一个元素,那么说:

$ awk -F"=|:" -v OFS="--" '{print $1, $NF}' file
x --y 
x1--y1

请注意,我们还告诉awk 使用-- 作为输出字段分隔符。

由于您没有发布任何尝试,因此在同一行中显示输出作为练习:)


更新问题

同样,你可以使用这个:

$ awk -F"=|:| " -v OFS="--" '/title/{print $1, $(NF-1), $NF}' a
0.0050276485--title--abc
0.185--title--xyz
0.234--title--bcd

这和以前一样,只是针对包含title 的行。在这些字段上,它根据=:(空格)分隔符打印第一个、倒数第二个和最后一个字段。

【讨论】:

  • 抱歉,我没有提及我的尝试和我的文件的全部内容。我的文件可以有任何数据。我必须找到不能使用 AWK 的上述模式(x=(PHRASE)title:y)。这是我触发的命令: grep -oP '[\d.]+(?==(PHRASE)title\:?)'
  • 为什么不能使用awk?使用所有这些详细信息更新您的问题。请注意,代码在 cmets 中很难阅读,因此会更清晰。谢谢!
  • @DarpanSanghavi 我已经更新了我的答案。注意grep 不太可能解决这个问题。 awk 是要走的路,或者也可能是 sed
  • @DarpanSanghavi 没问题 :) 为每项工作获得正确的工具是件好事!很高兴它对你有用。我正在为最终命令添加一些进一步的解释。
【解决方案2】:

Sed 版本

sed '/PHRASE/!d ;  s/:/\ \-\-\ / ; s/(PHRASE)/\-\-/' data

或者

sed 's/:/\ \-\-\ / ; /(PHRASE)/!d ; s//\-\-/' data

【讨论】:

  • 值得简要说明您的 sed 脚本如何实现原始海报所需要的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 2017-08-30
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 2015-07-26
相关资源
最近更新 更多