你的問題被標記了各種實用程序/膠水語言,包括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