2015-07-20 67 views
0

我有一個非常大的文件(許多千兆字節),它看起來像如何結合升序和降序排序?

input.txt中

a|textA|2 
c|textB|4 
b|textC|5 
e|textD|1 
d|textE|4 
b|textF|5 

在第一步,我想數字線由第三列按降序排序,並且如果行具有第三列的相同值,則它們必須按照第一列的文本排序 - 按升序排列。如果行的第1列和第3列的值相同,則必須按第2列按升序排序。第二列保證是獨一無二的。

所以,我希望得到的結果是:

desiredOutput.txt

b|textC|5 
b|textF|5 
c|textB|4 
d|textE|4 
a|textA|2 
e|textD|1 

我可以採取的第一步:

sort -t\| -bfrnk3 path/to/input.txt > path/to/output.txt 

但是,什麼是下一個步驟是什麼?也許結果可能在一次傳遞中實現?

編輯
我測試sort -t '|' -k 3,3nr -k 1,1 -k 2,2 input.txt > output.txt。它給出了以下「output.txt」:

b|textF|5 
b|textC|5 
c|textB|4 
d|textE|4 
a|textA|2 
e|textD|1 

這不是我想要的。

回答

2
$ cat file 
a|textA|2 
c|textB|4 
b|textC|5 
e|textD|1 
d|textE|4 
b|textF|5 
$ sort -t '|' -k 3,3nr -k 1,1 -k 2,2 file 
b|textC|5 
b|textF|5 
c|textB|4 
d|textE|4 
a|textA|2 
e|textD|1 
$ sort -t '|' -k 3,3nr file 
b|textC|5 
b|textF|5 
c|textB|4 
d|textE|4 
a|textA|2 
e|textD|1 
$ 

3,3nrn裝置數字排序,r手段反向。似乎-k 1,1 -k 2,2是可選的,因爲我猜sort將排序在升序默認順序。

+0

我不明白。我採取了兩個步驟:1.'sort -t'|' -k 3,3nr -k 1,1 -k 2,2 path/to/input.txt> path/to/pass1output.txt' 2. sort -t'|' -k 3,3nr path/to/pass1output.txt> path/to/output.txt'輸出與我想要的不同。 –

+0

它提供了與我想要的不同的輸出。你檢查了「** desiredOutput.txt **」嗎?將其與您的答案的結果文件進行比較。 –

+0

第一步之後(見上面的註釋) - 'b | textF | 5,b | textC | 5,c | textB | 4,d | textE | 4,a | textA | 2,e | textD | 1'。之後,第二步不會給出所需的輸出。你爲什麼重複'sort -t'|' -k 3,3nr'? –

0

如果這是UNIX:

sort -k 3 path/to/input.txt > path/to/output.txt 

您可以使用多個-k標誌以多列排序。

-k,--key = POS1 [,POS2]

:從 「人排序」

sort -k 3,2 -k 1,1 input.txt > output.txt 

相關的選項:例如,要由第3列,然後第一列的決勝局排序

在POS1開始一個密鑰,在POS2結束它(原點1)

POS是F [.C] [OPTS],其中F是字段號,C是字段中的字符位置。 OPTS是一個或多個單字母訂購選項,它會覆蓋該密鑰的全球訂購選項。如果沒有給出密鑰,則使用整行作爲密鑰。

-t,--field分離器SEP =

使用SEP代替非空白空白過渡。

0

您可以只按sort命令做到這一點: -

sort -t"|" -k3 -n -k1 -k2 inputFile.txt 

k3指定根據第3列,同樣​​& k2那種根據分別列第1 &第二。

+0

但如何將第3列的降序排序(數字)和第1和第2列的升序排序(按字母順序)結合起來? –

相關問題