Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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
Perl 将逗号分隔列表的第2列分隔为新行,每新行继承第1列中的值_Perl_Awk_Sed_Replace - Fatal编程技术网

Perl 将逗号分隔列表的第2列分隔为新行,每新行继承第1列中的值

Perl 将逗号分隔列表的第2列分隔为新行,每新行继承第1列中的值,perl,awk,sed,replace,Perl,Awk,Sed,Replace,我有一个选项卡分隔的文件,如下所示: ID1 blue ID2 yellow,blue ID3 green,yellow,red ID4 red 1D5 red,purple 对于第二列,我需要分离逗号列表,每种颜色都在它自己的行中,对于每一个新行,我需要保留ID# 我曾考虑使用sed将每个逗号替换为一个新行,但不确定如何重新添加关联的ID。Awk还是perl?经过多次搜索,我找不到答案 最终结果将没有逗号,如下所示: ID1 blue ID2 yellow,blue ID3 green,ye

我有一个选项卡分隔的文件,如下所示:

ID1 blue
ID2 yellow,blue
ID3 green,yellow,red
ID4 red
1D5 red,purple
对于第二列,我需要分离逗号列表,每种颜色都在它自己的行中,对于每一个新行,我需要保留ID#

我曾考虑使用sed将每个逗号替换为一个新行,但不确定如何重新添加关联的ID。Awk还是perl?经过多次搜索,我找不到答案

最终结果将没有逗号,如下所示:

ID1 blue
ID2 yellow,blue
ID3 green,yellow,red
ID4 red
1D5 red,purple
最终结果:

ID1 blue
ID2 yellow
ID2 blue
ID3 green
ID3 yellow
ID3 red
ID4 red
1D5 red
1D5 purple
ID1 blue
ID2 yellow
ID2 blue
ID3 green
ID3 yellow
ID3 red
ID4 red
1D5 red
1D5 purple
非常感谢您的帮助。
这个问题与非常类似,但我的第1列始终是一个值,而类似的问题有多个值,在第1列中用逗号分隔。我无法通过回顾类似的问题找到解决方案。希望这个问题足够清晰,可以留在这个网站上,也希望能帮助其他人

这个简单的
awk
程序应该可以:

$ awk -F'\t' '{ n=split($2,arr,","); for(i=1;i<=n;i++) print $1,arr[i] }' file
ID1 blue
ID2 yellow
ID2 blue
ID3 green
ID3 yellow
ID3 red
ID4 red
1D5 red
1D5 purple

$awk-F'\t'{n=split($2,arr,“,”);for(i=1;i您的问题用各种实用程序/粘合语言标记,包括Perl,因此此答案描述了使用Perl编程语言的解决方案

这里是一个Perl单行程序解决方案:

perl -lF/\\t/ -e 'print "$F[0] $_" for split /,/, $F[1]' test.txt
while (<>) {
    chomp;
    next unless length;
    my ($id, $colors) = split /\t/, $_;
    print "$id $_\n" foreach split /,/, $colors;
}
给定问题中描述的以制表符分隔的文件,将生成以下输出:

ID1 blue
ID2 yellow
ID2 blue
ID3 green
ID3 yellow
ID3 red
ID4 red
1D5 red
1D5 purple
这与下面的完整Perl脚本的工作原理大致相同:

perl -lF/\\t/ -e 'print "$F[0] $_" for split /,/, $F[1]' test.txt
while (<>) {
    chomp;
    next unless length;
    my ($id, $colors) = split /\t/, $_;
    print "$id $_\n" foreach split /,/, $colors;
}
这意味着,在文件的每一行中,对于颜色列表中的每个项目,打印ID(存储在
$F[0]
),然后打印颜色(存储在
$\ucode>)

我们通过拆分
$F[1]
(逗号上可能包含
黄色、蓝色
),并为每种颜色填充
$\uu
(使用
foreach
循环)来分别导出颜色

描述脚本版本:

perl -lF/\\t/ -e 'print "$F[0] $_" for split /,/, $F[1]' test.txt
while (<>) {
    chomp;
    next unless length;
    my ($id, $colors) = split /\t/, $_;
    print "$id $_\n" foreach split /,/, $colors;
}
while(){…}
从命令行上设置的文件(或从STDIN)中一次读取一行,并为每一行填充
$\uu

相关文档:

perl -lF/\\t/ -e 'print "$F[0] $_" for split /,/, $F[1]' test.txt
while (<>) {
    chomp;
    next unless length;
    my ($id, $colors) = split /\t/, $_;
    print "$id $_\n" foreach split /,/, $colors;
}
Perl的每一次完整安装都附带了
perldoc
命令,可以使用一段Perl文档的名称来调用该命令

见下文:

  • perldoc-perlrun
    ——对Perl命令行开关的解释
  • perldocperlintro
    ——Perl简介
  • perldocperlre
    ——Perl正则表达式的深层概述
  • perldoc-f split
    ——解释Perl的
    split
    函数是如何工作的
  • perldoc-perlsyn
    ——描述Perl的控制结构,如
    foreach
    循环
  • perldoc-perlop
    ——Perl运算符概述,包括
此外,如果您的数据比显示的更复杂,使用诸如引用和转义分隔符之类的结构,您可能更喜欢使用
Text::CSV
CPAN模块来解析TSV/CSV文件。

这可能适合您(GNU-sed):


将每个
替换为一个新行,后跟键及其空格(制表符)。

在awk之后也可以帮助您完成相同的操作

awk '{gsub(/,/,RS $1"&");gsub(/,/," ")} 1'   Input_file
说明:

perl -lF/\\t/ -e 'print "$F[0] $_" for split /,/, $F[1]' test.txt
while (<>) {
    chomp;
    next unless length;
    my ($id, $colors) = split /\t/, $_;
    print "$id $_\n" foreach split /,/, $colors;
}
gsub(/,/,RS$1“&”):使用awk的全局替换实用程序将一行中的每个逗号替换为
RS
(新行)$1(该行的第一个字段)“&”表示此处的逗号(表示我们提到要替换的变量/regex)

gsub(/,/,“”):再次使用全局替换实用程序来
awk
,因此上面的
gsub
将使输入文件如下所示

ID1 blue
ID2 yellow
ID2,blue
ID3 green
ID3,yellow
ID3,red
ID4 red
1D5 red
1D5,purple
这不是OP的输出,所以再次用简单空格全局替换逗号,得到正确的输出,如下所示

ID1 blue
ID2 yellow
ID2,blue
ID3 green
ID3,yellow
ID3,red
ID4 red
1D5 red
1D5,purple

$awk-F'[\t,]'{for(i=2;非常感谢,Ed!@Cath,不客气,很高兴它帮助了你。看到这个,享受学习和分享知识,干杯:)谢谢你提供的所有细节,DavidO!