我的数据格式如下:
输入数据:
<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来做同样的事情吗?在这里,我希望输入数据的最后一列在输出数据
中显示为#@的第一行答案 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中似乎是一种理智的方式。