如何结合升序和降序排序?
我有一个非常大的文件(许多千兆字节),它看起来像如何结合升序和降序排序?
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,3nr
n
装置数字排序,r
手段反向。似乎-k 1,1 -k 2,2
是可选的,因为我猜sort
将排序在升序默认顺序。
如果这是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 &第二。
但如何将第3列的降序排序(数字)和第1和第2列的升序排序(按字母顺序)结合起来? –
我不明白。我采取了两个步骤: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'输出与我想要的不同。 –
它提供了与我想要的不同的输出。你检查了“** desiredOutput.txt **”吗?将其与您的答案的结果文件进行比较。 –
第一步之后(见上面的注释) - 'b | textF | 5,b | textC | 5,c | textB | 4,d | textE | 4,a | textA | 2,e | textD | 1'。之后,第二步不会给出所需的输出。你为什么重复'sort -t'|' -k 3,3nr'? –