我想以下列方式转换文件:
输入:
LOC100132062,LOC100133331 0.37927964653622 0.434306394092769
ATAD3A,ATAD3B,ATAD3C 14.9379319811031 15.6244071876106 14.2514567745956
MMP23A,SLC35E2 1.23714660156378 0.99559795831378 1.47869524481378
.
.
.
首选输出:
LOC100132062,LOC100133331 0.37927964653622 0.434306394092769
LOC100132062,LOC100133331 0.37927964653622 0.434306394092769
ATAD3A,ATAD3B,ATAD3C 14.9379319811031 15.6244071876106 14.2514567745956
ATAD3A,ATAD3B,ATAD3C 14.9379319811031 15.6244071876106 14.2514567745956
ATAD3A,ATAD3B,ATAD3C 14.9379319811031 15.6244071876106 14.2514567745956
MMP23A,SLC35E2 1.23714660156378 0.99559795831378 1.47869524481378
MMP23A,SLC35E2 1.23714660156378 0.99559795831378 1.47869524481378
即。对于每一行中出现的每个字符串(此处为逗号),我想计算它,然后按该出现次数复制相同的行。所以在第一行有一个逗号,所以重复一次,在第二行有两个逗号,所以重复该行两次,等等。
理想情况下,第一列将是最初用逗号分隔的唯一字符串,但我也对上面的内容非常满意!必须有一个简单的解决方案,但我似乎无法弄明白。
答案 0 :(得分:3)
一种方法是为每个以逗号分隔的字段打印一行,如此
awk -F, '{for (i=0;i<NF;i++) print }' input
答案 1 :(得分:1)
在我看来,你想要一个中间步骤,当你想要的是这个时候:
perl -ne 's/(\S++)//;$a=$1;unshift(@b,$1)while s/(\S++)//;print"$_\t@{[pop@b]}\n"for split/,/,$a;@b=()' FILENAME
给出此输入时:
LOC100132062,LOC100133331 0.37927964653622 0.434306394092769
ATAD3A,ATAD3B,ATAD3C 14.9379319811031 15.6244071876106 14.2514567745956
MMP23A,SLC35E2 1.23714660156378 0.99559795831378 1.47869524481378
生成以下输出:
LOC100132062 0.37927964653622
LOC100133331 0.434306394092769
ATAD3A 14.9379319811031
ATAD3B 15.6244071876106
ATAD3C 14.2514567745956
MMP23A 1.23714660156378
SLC35E2 0.99559795831378
答案 2 :(得分:0)
awk '{i=gsub(",",",");for (x=0;x<=i;x++) print $0}' x.dat
答案 3 :(得分:0)
要从Perl获取输出,可以使用
perl -ape 'print $_ x $F[0] =~ y/,//'
标量上下文中的转换返回出现次数。
如果您只希望每行保留一个以逗号分隔的字符串,则可以将其更改为
perl -ane 's/.*?\s//; for my $s (0 .. $F[0] =~ tr/,//) {print +(split /,/, $F[0])[$s], " $_"}'
答案 4 :(得分:0)
这可能适合你(GNU sed):
sed 'h;:a;G;s/^[^,]*\n//;t;s/^[^,]*,//;ta' file
答案 5 :(得分:0)
再使用Perl:
perl -F"," -ane 'print $_ x @F;' file