解析shell中的非结构化数据

时间:2015-01-12 11:04:34

标签: linux shell parsing grep

我想解析以下文件:

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:?)'

但它没有给我正确的输出。 对不起前面的问题。目前尚不清楚。

2 个答案:

答案 0 :(得分:2)

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

$ 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的行。在这些上,它会根据=:(空格)分隔符打印第一个,倒数第二个和最后一个字段。

答案 1 :(得分:0)

Sed版

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

或者

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