2014-01-31 15 views
1

我有內容的形式,給出一個標題,然後根據該內容寫入。如何將標題和底層內容作爲一個單元進行排序?

我需要對標題進行排序,但底層內容將獨立排序,而不是以標題爲單位排序。

我可以做的一個方法是grep所有的標題將這些動態進行排序,然後將標題和下面的行的標題粘貼到一個新文件中。

但我想要一些有效的方法來做到這一點。請提出一些方法。的含量將樣品在下面給出(貨幣是標題和下面給出對於該貨幣的序列號)

C01 
==== 
892341231,786754321,1234567 

C05 
==== 
78675433432, 1245673234 
+0

請顯示所需的輸出。什麼是'序列號' - 數字鈔票的例子?序列號列表有多大?他們是否分裂成多行?最有可能的是,您需要格式化輸入數據,以便每個貨幣及其所有序列號位於一行中,對該列表進行排序,然後再將單行數據重新轉換爲多行。 –

+0

@JonathanLeffler:謝謝喬納森回覆, 我需要根據上面的標題按排序格式輸出它已經按升序排序 是以下數據標題中的數據是在一行中 – Learner

+0

並且數據包括行等號和貨幣之間的空白線? –

回答

1

與數據的單個線Unix的sort命令交易。一種選擇,如在評論概述,是將數據轉換爲每貨幣單行線,使用sort,然後解開復合線:

sed -e 'N;N;N;s/\n/ /g' data | sort | perl -p -e 's/ (=+) /\n$1\n/; s/ $/\n/;' 

sed被證明頑抗關於把換行符到字符串,這樣我用perl代替。當然,如果您完全使用perl,則可以在perl中完成整個工作。這是詳細的版本中,sedsort部分的相當直接的音譯,但沒有必要刪除換行符,其排序後簡化了打印:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @currencies; 

while (<>) 
{ 
    my $l2 = <>; 
    my $l3 = <>; 
    my $l4 = <>; 
    push @currencies, "$_$l2$l3$l4"; 
} 

print foreach (sort @currencies); 

給定的輸入文件:

C01 
==== 
892341231,786754321,1234567 

C05 
==== 
78675433432,1245673234 

C02 
==== 
444341231,333754321,2224567 

兩個腳本產生的輸出:

C01 
==== 
892341231,786754321,1234567 

C02 
==== 
444341231,333754321,2224567 

C05 
==== 
78675433432,1245673234 

這是Perl的,所以有一個以上的方式做這(TMTOWTDI )和其他方式使用較少的蠻力,並且比一次讀取4行更脆弱。例如,您可以將行分隔符設置爲""以強制段落模式,因此輸入的每個「行」都是由一個或多個空行分隔的段落。

#!/usr/bin/env perl 
use strict; 
use warnings; 

local $/ = ""; 
my @currencies = <>; 
print foreach (sort @currencies); 

當然,即使這有點冗長。我們廢除了明確的陣列,因此我們不需要use strict;,我們可以只是負擔得起將其降低到:

local $/ = ""; 
print foreach (sort <>); 

或者你可以添加shebang行:

#!/usr/bin/perl -w 
local $/ = ""; 
print foreach (sort <>); 
相關問題