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

つまり、各行に出現するすべての文字列(ここではコンマ)について、それをカウントしてから、同じ行をその出現回数だけ複製したいと思います。したがって、最初の行には1つのコンマがあるので、1回複製し、2番目の行には2つのコンマがあるので、その行を2回複製します。

理想的には、最初の列は元々コンマで区切られた一意の文字列になりますが、上記にも非常に満足しています。これには簡単な解決策が必要ですが、私には理解できないようです。

4

6 に答える 6

3

1つの方法は、カンマ区切りのフィールドごとに1回行を出力することです。

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

これはうまくいくかもしれません(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 -ape 'print $_ x $F[0] =~ y/,//'

スカラー コンテキストでの変換は、出現回数を返します。

カンマ区切りの文字列を 1 行に 1 つだけ保持する場合は、次のように変更できます。

perl -ane 's/.*?\s//; for my $s (0 .. $F[0] =~ tr/,//) {print +(split /,/, $F[0])[$s], " $_"}'
于 2012-11-08T15:06:09.760 に答える
0

Perl を使用してもう 1 つ:

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