解析 shell 中的非结构化数据
Parse unstructured data in shell
我要解析以下文件:
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:?)'
但它没有给我正确的输出。
抱歉之前的问题。不清楚。
如果你想要的是=
之前的第一个元素和:
之后的最后一个元素,那么说:
$ awk -F"=|:" -v OFS="--" '{print , $NF}' file
x --y
x1--y1
请注意,我们还告诉 awk
使用 --
作为输出字段分隔符。
由于您没有 post 任何尝试,所以在同一行中显示输出作为练习 :)
从更新的问题更新
同样,你可以这样使用:
$ awk -F"=|:| " -v OFS="--" '/title/{print , $(NF-1), $NF}' a
0.0050276485--title--abc
0.185--title--xyz
0.234--title--bcd
这和以前一样,只是针对包含 title
的行。在这些上,它根据 =
、:
或
(space) 分隔符打印第一个、倒数第二个和最后一个字段。
Sed 版本
sed '/PHRASE/!d ; s/:/\ \-\-\ / ; s/(PHRASE)/\-\-/' data
或者
sed 's/:/\ \-\-\ / ; /(PHRASE)/!d ; s//\-\-/' data
我要解析以下文件:
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:?)'
但它没有给我正确的输出。 抱歉之前的问题。不清楚。
如果你想要的是=
之前的第一个元素和:
之后的最后一个元素,那么说:
$ awk -F"=|:" -v OFS="--" '{print , $NF}' file
x --y
x1--y1
请注意,我们还告诉 awk
使用 --
作为输出字段分隔符。
由于您没有 post 任何尝试,所以在同一行中显示输出作为练习 :)
从更新的问题更新
同样,你可以这样使用:
$ awk -F"=|:| " -v OFS="--" '/title/{print , $(NF-1), $NF}' a
0.0050276485--title--abc
0.185--title--xyz
0.234--title--bcd
这和以前一样,只是针对包含 title
的行。在这些上,它根据 =
、:
或 (space) 分隔符打印第一个、倒数第二个和最后一个字段。
Sed 版本
sed '/PHRASE/!d ; s/:/\ \-\-\ / ; s/(PHRASE)/\-\-/' data
或者
sed 's/:/\ \-\-\ / ; /(PHRASE)/!d ; s//\-\-/' data