2016-09-30 2 views
0

У меня есть кадр данных с разделителями табуляции с конечным столбцом, содержащим вложенную информацию, которая является '|' разграничены. Обратите внимание, что все строки поддерживают эту вложенную вводную структуру предшествует «REP =»Разделение вложенных столбцов на несколько столбцов UNIX

col1 col2 col3 col4 
ID1  text text text...REP=(info1|info2|info3) 
ID2  text text text...REP=(info1|info2|info3) 

Я хотел бы обработать эту последнюю колонку таким образом, что вся информация внутри Вводного новая колонка:

col1 col2 col3 col4 newcol newcol2 newcol3 
ID1  text text text info1  info2  info3 
ID2  text text text info1  info2  info3 

Я подумал бы, что команда AWK была бы полезна, но у меня возникли проблемы с ее структурированием. Любая помощь приветствуется.

+0

Являются ли эти точки перед REP действительно там, или это больше столбцов? –

+0

... представляют дополнительный текст в col4, который встречается до «REP =» – AMS

+0

Есть ли вкладка перед «REP»? –

ответ

1

perl один лайнер, не изменяет заголовок, хотя

$ cat ip.txt 
col1 col2 col3 col4 
ID1  text text text REP=(info1|info2|info3) 
ID2  text text text REP=(info1|info2|info3) 

$ perl -pe 's/\s*REP=\(([^)]+)\)/"\t".$1=~tr#|#\t#r/e' ip.txt 
col1 col2 col3 col4 
ID1  text text text info1 info2 info3 
ID2  text text text info1 info2 info3 
  • \s*REP=\(([^)]+)\) ноль или более пробелы, а затем REP( следуют группы захвата для извлечения отличных ) символов и, наконец, )
  • e модификатор позволяет использовать код Perl в разделе замены
  • $1=~tr#|#\t#r изменения | вкладки из захваченной группы, которая затем каскадная в строку, содержащей вкладку
+0

Когда я пытаюсь запустить этот код, я получаю сообщение об ошибке следующим образом: В этом поле найдено, где оператор ожидал на -e строке 1, рядом с «s/\ |/\ t/gr» синтаксическая ошибка на -e строке 1, near "s/\ |/\ t/gr" Выполнение -e отменено из-за ошибок компиляции. – AMS

2

awk на помощь!

$ awk -v OFS='\t' 'NR==1{nh=NF; header=$0; next} 
         {v=$NF; 
         sub(/.*REP=/,"",v); 
         sub(/\.\.\.REP=.*/,"",$NF); 
         gsub(/[()]/,"",v); 
         n=split(v,vs,"|"); 
         for(i=1;i<=n;i++) $(NF+i)=vs[i]} 
        NR==2{printf "%s", header; 
         for(i=1;i<=n;i++) printf "%s", OFS "col"(nh+i); 
         print ""}1' file | column -t 

col1 col2 col3 col4 col5 col6 col7 
ID1 text text text info1 info2 info3 
ID2 text text text info1 info2 info3 
+0

спасибо огромное! – AMS

+1

не спешите принимать ответ; upvote в порядке, возможно, будет лучшее решение, если вы подождете немного дольше. Я делаю это как упражнение по программированию без особых размышлений. – karakfa

+0

Не является поклонником стиля отступов, но это именно то, как я его реализовал. –

0

Это делает оставить вкладку в конце, но это может быть исправлено с дополнительным GSUB.

awk 'NR==1 {print $0,"col4\tnewcol\tnewcol2\tnewcol3")} NR>1 {gsub(/...REP=\(|\||\)/, "\t");print}' input.txt 
+0

Вам нужно только обновить заголовок в первой строке, а не в каждой строке: 'awk 'NR == 1 {print $ 0," \ tnewcol1 ... "} NR> 1 {gsub (/ REP .../.. .); print} '' –

+0

Спасибо, @glennjackman. Обновлено. –

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