2013-11-21 50 views
-4

我有如下文件。將單行轉換爲perl中的多行

ID || DATE || AMOUNT 
XX||[email protected]@[email protected]@[email protected]@20131101||[email protected]@[email protected]@[email protected]@400 

我希望輸出如下使用perl。

xx||20130801||100 

xx||20130901||200 

xx||20131001||300 

xx||20131101||400 

請幫助我如何使用perl進行轉換。

+1

哪裏的嘗試失敗? – benka

+4

'perldoc perlintro' – toolic

+2

不要失望downvotes。在發佈問題之前閱讀堆棧溢出問題。如果你不做家庭作業,這是一個殘酷的地方。 – slayedbylucifer

回答

1
perl -F'\|\||@@' -lanE'$.>1 or $" ="||",next; say "@F[0,$_,$_+4]" for 1..4' file 
+0

感謝你的單行。但是這個硬編碼爲4個條目。儘管OP沒有提到它,但我相信命令應該是任何數量的條目都是通用的。 – jkshah

+1

@jkshah'1 .. $#F/2'解決了這個問題 –

+0

現在我必須說你的解決方案是傑作! – jkshah

1
perl -F'\|\|' -lane '@a=split(/@@/,$F[1]); @b=split(/@@/,$F[2]); print "$F[0]||$a[$_]||$b[$_]" foreach 0..$#a;' file 

輸出:

ID || DATE || AMOUNT 
XX||20130801||100 
XX||20130901||200 
XX||20131001||300 
XX||20131101||400 
+1

總是在無效的情況下使用foreach而不是map,因爲它是誤導性的 –

+0

@mpapec感謝您的建議。更新了ans。我想知道'foreach'和'for'是否有區別。你似乎在你的代碼中使用了'for',兩者都正常工作。 – jkshah

+2

+1,使用任何你喜歡的,他們是同義詞http://perldoc.perl.org/perlsyn.html#Foreach-Loops –