如何结合升序和降序排序?

问题描述:

我有一个非常大的文件(许多千兆字节),它看起来像如何结合升序和降序排序?

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 

这不是我想要的。

$ 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'? –

如果这是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代替非空白空白过渡。

您可以只按sort命令做到这一点: -

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

k3指定根据第3列,同样​​& k2那种根据分别列第1 &第二。

+0

但如何将第3列的降序排序(数字)和第1和第2列的升序排序(按字母顺序)结合起来? –