我有一个制表符分隔的数据框,其最后一列包含嵌套信息,这些信息是' |'分隔。请注意,所有行都维护此嵌套的括号结构,前面是' 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命令会很有用,但是我很难适当地构建它。任何帮助将不胜感激。
答案 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