2015-04-05 75 views
-1

我有以下格式的數據:將數據轉換

輸入數據:

<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++解析文件來做到這一點,但我也可以使用linux命令WK等或使用Python?在這裏,我希望輸入數據的最後一列顯示爲#@輸出數據中的第一行

回答

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。