将嵌套列拆分为多列UNIX

时间:2016-09-30 16:08:57

标签: unix awk

我有一个制表符分隔的数据框,其最后一列包含嵌套信息,这些信息是' |'分隔。请注意,所有行都维护此嵌套的括号结构,前面是' REP ='

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

我想处理最后一列,以便括号内的所有信息都是新列:

int.TryParse

我认为AWK命令会很有用,但是我很难适当地构建它。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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|更改为已捕获组中的标签,然后将其连接到包含标签的字符串

答案 2 :(得分:0)

这会在最后留下一个标签,但可以使用额外的gsub修复。

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