2015-04-05 3 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 -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 

кажется здравым способом сделать это в (г | т) AWK.

Смежные вопросы