Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sed、awk等指定目标字符串在该行中出现的次数,重复行_Sed_Awk - Fatal编程技术网

使用sed、awk等指定目标字符串在该行中出现的次数,重复行

使用sed、awk等指定目标字符串在该行中出现的次数,重复行,sed,awk,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   
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
i、 对于每一行中出现的每一个字符串(这里是逗号),我想对其进行计数,然后按出现的次数复制同一行。在第一行有一个逗号,重复一次,在第二行有两个逗号,重复那行两次,以此类推


理想情况下,第一列将是最初由逗号分隔的唯一字符串,但我也很乐意看到上面的内容!一定有一个简单的解决办法,但我似乎想不出来

awk'{i=gsub(“,”,“,”);for(x=0;x
awk'{i=gsub(“,”,”);for(x=0;x一种方法是为每个逗号分隔的字段打印一行,如下所示

awk '{i=gsub(",",",");for (x=0;x<=i;x++) print $0}' x.dat
awk -F, '{for (i=0;i<NF;i++) print }' input

awk-F'{for(i=0;i一种方法是为每个逗号分隔的字段打印一行,如下所示

awk -F, '{for (i=0;i<NF;i++) print }' input

awk-F'{for(i=0;i要从Perl获得输出,可以使用

perl -ape 'print $_ x $F[0] =~ y/,//'
标量上下文中的转换返回出现的次数

如果希望每行只保留一个逗号分隔的字符串,可以将其更改为

perl -ane 's/.*?\s//; for my $s (0 .. $F[0] =~ tr/,//) {print +(split /,/, $F[0])[$s], " $_"}'

要从Perl获得输出,可以使用

perl -ape 'print $_ x $F[0] =~ y/,//'
标量上下文中的转换返回出现的次数

如果希望每行只保留一个逗号分隔的字符串,可以将其更改为

perl -ane 's/.*?\s//; for my $s (0 .. $F[0] =~ tr/,//) {print +(split /,/, $F[0])[$s], " $_"}'
这可能适用于您(GNU-sed):

这可能适用于您(GNU-sed):

使用Perl还有一个问题:

perl -F"," -ane 'print $_ x @F;' file
使用Perl还有一个问题:

perl -F"," -ane 'print $_ x @F;' file

在我看来,你要求的是一个中间步骤,而你想要的是:

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

在我看来,你要求的是一个中间步骤,而你想要的是:

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

太棒了。非常感谢。太棒了。非常感谢。+1是最好的解决方案,但我想知道你为什么从0循环到NF-1而不是从1循环到NF-后者更常见…@EdMorton迭代零索引数组的老习惯我猜+1是最好的解决方案,但我想知道你为什么从0循环到NF-1而不是从1循环到NF-1NF-后者更为常见…@EdMorton通过迭代零索引数组的老习惯我猜注意到这段代码假定名称和数字的数量相等。因此在最后一行输入中,最后一个数字被忽略,因为它被认为没有对应的名称。注意,这段代码假定名称和数字的数量相等因此,在输入的最后一行中,最后一个数字被忽略,因为它被认为没有对应的名称。