转换数据

时间:2015-04-05 21:16:00

标签: python linux awk

我的数据格式如下:

输入数据:

 <http://A> <http://code.google.com/p/ldspider/ns#headerInfo> _:H  <id_0> .
<id_0> <C> <http://A>  <id_1> .
 _:H <http://www.w3.org/2006/http#responseCode> "200"^^<http://www.w3.org/2001/XMLSchema#integer>  <id_2> .
<id_2> <C> <http://A>  <id_3> .
 _:H <http://www.w3.org/2006/http#date> "Mon, 23 Apr 2012 13:49:27 GMT"  <id_4> .
<id_4> <C> <http://A>  <id_5> .
 _:H <http://www.w3.org/2006/http#content-type> "application/rdf+xml; charset=UTF-8"  <id_6> .

我想将此数据转换为以下格式:

输出数据:

 #@ <id_0>
 <http://A> <http://code.google.com/p/ldspider/ns#headerInfo> _:H  .
 #@ <id_1> 
 <id_0> <C> <http://A> .
 #@ <id_2>
 _:H <http://www.w3.org/2006/http#responseCode> "200"^^<http://www.w3.org/2001/XMLSchema#integer> .
 #@ <id_3>
 <id_2> <C> <http://A> .
 #@ <id_4>
 _:H <http://www.w3.org/2006/http#date> "Mon, 23 Apr 2012 13:49:27 GMT" .
 #@ <id_5>
 <id_4> <C> <http://A> .
 #@ <id_6>
 _:H <http://www.w3.org/2006/http#content-type> "application/rdf+xml; charset=UTF-8" .

我知道我可以通过解析文件使用c ++轻松完成此操作,但是我也可以使用像awk等linux命令或使用python来做同样的事情吗?在这里,我希望输入数据的最后一列在输出数据

中显示为#@的第一行

1 个答案:

答案 0 :(得分:2)

鉴于某些数据看起来并不完整,我会将其视为纯文本,并使用正则表达式手动隔离最后两个字段,以避免修剪有意义的空格。

使用GNU sed,这可能如下所示:

sed -r 's/^(.*\S)\s+(\S+)\s+(\S+)$/#@ \2\n\1 \3/' filename

\s\S是一个GNU扩展,分别匹配空格和除空白之外的所有内容;其余的只是将线分成捕获组并在打印前重新组装。请注意,这会删除倒数第三个字段和最后一个字段(行末尾的.)之间的多余空格。按照您的示例输出,这似乎是您想要的。

如果空白修剪不是一个担心,那么

awk '{ print "#@ " $(NF - 1); $(NF - 1) = $NF; --NF; print }' filename

在(g | m)awk中似乎是一种理智的方式。