0

我想通过以下方式转换文件:

输入:

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

即对于每行中出现的每个字符串(此处为逗号),我想对其进行计数,然后将同一行复制相同的出现次数。所以在第一行有一个逗号,所以复制一次,在第二行有两个逗号,所以复制该行两次,等等。

理想情况下,第一列将是最初用逗号分隔的唯一字符串,但我对上面的内容也很满意!必须有一个简单的解决方案,但我似乎无法弄清楚。

4

6 回答 6

3

一种方法是为每个逗号分隔的字段打印一次,就像这样

awk -F, '{for (i=0;i<NF;i++) print }' input
于 2012-11-08T15:03:35.663 回答
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
于 2012-11-10T09:49:38.663 回答
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], " $_"}'
于 2012-11-08T15:06:09.760 回答
0

这可能对您有用(GNU sed):

sed 'h;:a;G;s/^[^,]*\n//;t;s/^[^,]*,//;ta' file
于 2012-11-08T15:26:38.490 回答
0
awk '{i=gsub(",",",");for (x=0;x<=i;x++) print $0}' x.dat
于 2012-11-08T15:00:46.683 回答
0

另一个使用 Perl:

perl -F"," -ane 'print $_ x @F;' file
于 2012-11-08T16:02:39.540 回答