给出目标字符串在sed,awk等行中出现的次数的重复行

时间:2012-11-08 14:48:59

标签: sed awk

我想以下列方式转换文件:

输入:

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

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

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

6 个答案:

答案 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