你的问题被标记了各种实用程序/胶水语言,包括Perl,所以这个答案描述了使用Perl编程语言的解决方案。
这里是一个Perl单行溶液:
perl -lF/\\t/ -e 'print "$F[0] $_" for split /,/, $F[1]' test.txt
鉴于制表符分隔的文件如本产生以下输出的问题描述:
ID1 blue
ID2 yellow
ID2 blue
ID3 green
ID3 yellow
ID3 red
ID4 red
1D5 red
1D5 purple
这工作大致与以下内容相同完整Perl脚本:
while (<>) {
chomp;
next unless length;
my ($id, $colors) = split /\t/, $_;
print "$id $_\n" foreach split /,/, $colors;
}
在这些解决方案中,我使用\t
在选项卡上分割,尽管您提供的示例数据似乎不是以空格分隔的,而是专门用于制表符分隔。如果您的数据实际上只是“空白”分隔符,请将\t
更改为\s+
。
下面是一行代码是如何工作的:
-l
台自动格格输入和自动换行输出。 -F
切换隐式设置-a
(意思是自动分割为@F
)和-n
(这意味着迭代在命令行上传递的输入文件)。
-F/\\t/
表示在/\t/
正则表达式上自动分割,换句话说,在制表符上填充@F
并结果。 (如果您的数据更普遍空格分隔你可以改变\\t
到\\s+
)
因此,对于输入的每一行,$F[0]
将包含IDx
领域,$F[1]
将包含颜色,如yellow,blue
。
-e
命令行开关意味着评估以下代码,并且因为我们有-n
隐含在-F
中,所以我们迭代该文件并在输入文件的每行执行一次代码。
而我们在通过代码是:
print "$F[0] $_" foreach split /,/, $F[1]
这意味着每文件的行,在颜色列表中的每个项,打印随后颜色的ID(存储在$F[0]
)(存储在$_
)。
我们通过拆分$F[1]
,其中可能包含yellow,blue
上逗号,并为每种颜色(使用foreach
环)填充$_
单独导出的颜色。
描述脚本版本:
while(<>) {...}
读取在通过命令行(或从STDIN)上设置的文件一次一行,并且对于每个线填充$_
。
相关文章:
的Perl附带perldoc
命令,可以用一块Perl的文档阅读的名字被调用的每一个完整的安装。
请参阅以下内容:
perldoc perlrun
- Perl的命令行开关的说明。
perldoc perlintro
- Perl简介。
perldoc perlre
- 深入的Perl正则表达式概述。
perldoc -f split
- 解释Perl的split
函数的工作原理。
perldoc perlsyn
- 描述Perl的控制结构,如foreach
循环。
perldoc perlop
- Perl操作员的概述,包括<>
。
此外,如果你的数据是复杂得多所示,使用结构,如报价和分隔符的逃避,你应该更喜欢解析TSV/CSV文件中Text::CSV
CPAN模块。
非常感谢,埃德! – Cath