2013-04-24 122 views
0

您好,我正在嘗試在perl(或ruby)中將單個數據從文件讀取到數組中,並在第10個元素之後用換行符在列中打印。Perl /紅寶石單線陣列操作

的文件是這樣的

Name 
Course1 
Mark1 
Course2 
Mark2 
Course3 
Mark3 
Course4 
Mark4 

而且應顯示這樣

Name Course1 Mark1 Course2 Mark2 Course3 Mark3 Course4 Mark4 

這是我曾嘗試遠

perl -ne '@a=split"\n",$_;print join("\t"=>[email protected],0,10)' Data.txt 
+0

在輸出中如何分隔列;與標籤? – 2013-04-24 23:32:56

+0

是的,他們被標籤分開 – user1976336 2013-04-24 23:37:28

+0

你說「每10個元素之後」,但你的例子只有9. 9或10? – ikegami 2013-04-24 23:47:40

回答

5

這並不工作,因爲當你每次閱讀一行時你都在換行。你需要-0777才能使它工作。

你也只打印前10個元素,所以你需要引入一個循環。

perl -0777nE'@F = split /\n/; say join "\t", splice @F,0,10 while @F' Data.txt 

乞求利用-a

perl -F'\n' -0777naE'say join "\t", splice @F,0,10 while @F' Data.txt 

或者,我們可以採取一個完全不同的方法。短而甜:

perl -pe's/\n/\t/ if $. % 10' Data.txt 

如果沒有10列的倍數,那麼將以尾部標籤而不是換行符結束。好吧,不太好。那麼怎麼樣

perl -0777pe's/\n(?!\z)/ ++$i % 10 ? "\t" : "\n" /eg' Data.txt 

更新你從此改變你的問題,要求固定寬度的字段。

如果你事先知道寬度(說字段之間10 + 2個字符= 12):

perl -F'\n' -0777naE'say pack "(A12)9 A*", splice @F,0,10 while @F' Data.txt 

如果不這樣做:

perl -MList::Util=max -F'\n' -0777naE' 
    $w = 2 + max map length, @F; 
    say pack "(A$w)9 A*", splice @F,0,10 while @F; 
' Data.txt 
+0

非常感謝你的工作:)。現在添加到它,是否可以使用「字段大小」來使列很好地對齊? – user1976336 2013-04-24 23:47:59

+0

+1對於很好的解釋 – chrsblck 2013-04-24 23:48:23

+0

@ user1976336,你說你想使用製表符。如果你想要固定寬度的字段,這是一個完全不同的問題! – ikegami 2013-04-24 23:50:00

0

池上打我給它。但我會發布我的反正。

perl -pe 'tr/\n/\t/ if $. % 9 != 0' 

編輯: 啊,甚至更好。謝謝ikegami($.,我忘了那個)。

2
ruby -e 'ARGF.map{|l|l.strip}.each_slice(10) {|a| puts a.join "\t"}' Data.txt 
+0

它會幫助OP如果你*解釋*代碼在做什麼。不要給人魚,教他們如何釣魚。 – 2013-04-25 02:39:16

0

數據示例僅爲9行,因此不適合方便地放入十行存儲桶中。我添加了一個佔位符,所以我的文本文件看起來像:

 
Name 
Course1 
Mark1 
Course2 
Mark2 
Course3 
Mark3 
Course4 
Mark4 
----- 
Name 
Course1 
Mark1 
Course2 
Mark2 
Course3 
Mark3 
Course4 
Mark4 
----- 

我會做它用Ruby的東西沿着這些路線:

puts ARGF.lines.map(&:chomp).each_slice(10).map{ |a| a.join(' ') } 

這給了我一個輸出類似:

 
Name Course1 Mark1 Course2 Mark2 Course3 Mark3 Course4 Mark4 ----- 
Name Course1 Mark1 Course2 Mark2 Course3 Mark3 Course4 Mark4 ----- 

使用製表符而不是空格很簡單:將' '替換爲"\t",但如何作爲練習留給讀者。

map(&:chomp)剝去拖尾行結束符,以便打印時字段可以存在於一行上。 each_slice(10)每次抓取10個數組元素,這會產生一個數組數組,每個子數組包含10個字符串。最後的map{ |a| a.join(' ') }將空格或標籤(如果更改爲"\t")連接到子陣列。或者,可以使用a * ' 'a * "\t"代替join,但join更常用。