Unix 按列对分隔文件进行排序

Unix 按列对分隔文件进行排序,unix,sorting,sed,awk,Unix,Sorting,Sed,Awk,我的输入文件如下所示,我需要根据分隔符“~”对该文件进行排序,即第1列按升序排列,第5列按降序排列 010001~01001~JAN-00~009901~1~ 010001~01001~JAN-00~009901~2~ 010001~01001~JAN-00~009901~W~ 010001~01001~JAN-00~009901~X~ 010001~01001~JAN-00~009901~Z~ 010001~01001~JAN-00~009901~i~ 010001~0

我的输入文件如下所示,我需要根据分隔符“~”对该文件进行排序,即第1列按升序排列,第5列按降序排列

010001~01001~JAN-00~009901~1~  
010001~01001~JAN-00~009901~2~  
010001~01001~JAN-00~009901~W~  
010001~01001~JAN-00~009901~X~  
010001~01001~JAN-00~009901~Z~  
010001~01001~JAN-00~009901~i~  
010001~01001~JAN-00~009901~j~  
010001~01001~JAN-00~009901~m~  
010001~01001~JAN-00~009901~n~  
010001~01001~JAN-00~009901~o~  
010001~01001~JAN-00~009901~p~  
010001~01001~JAN-00~009901~q~  
200407~20043~JUL-04~200307~P~  
200407~20043~JUL-04~200307~V~  
200407~20043~JUL-04~200307~k~  
200408~20043~AUG-04~200308~P~  
200408~20043~AUG-04~200308~V~  
200408~20043~AUG-04~200308~k~  
200409~20043~SEP-04~200309~P~  
200409~20043~SEP-04~200309~V~  
200409~20043~SEP-04~200309~k~  
200410~20044~OCT-04~200310~P~  
200410~20044~OCT-04~200310~V~  
200410~20044~OCT-04~200310~k~  
200411~20044~NOV-04~200311~P~  
200411~20044~NOV-04~200311~V~  
200411~20044~NOV-04~200311~k~  
200412~20044~DEC-04~200312~P~  
200412~20044~DEC-04~200312~V~  
200412~20044~DEC-04~200312~k~  
我尝试了下面的命令,但没有得到想要的结果

sort -t$'~' -k1 -k5r filename
我的结果文件应该如下所示匹配

010001~01001~JAN-00~009901~q~  
010001~01001~JAN-00~009901~p~  
010001~01001~JAN-00~009901~o~  
010001~01001~JAN-00~009901~n~  
010001~01001~JAN-00~009901~m~  
010001~01001~JAN-00~009901~j~  
010001~01001~JAN-00~009901~i~  
010001~01001~JAN-00~009901~Z~  
010001~01001~JAN-00~009901~X~  
010001~01001~JAN-00~009901~W~  
010001~01001~JAN-00~009901~2~  
010001~01001~JAN-00~009901~1~  
200407~20043~JUL-04~200307~k~  
200407~20043~JUL-04~200307~V~  
200407~20043~JUL-04~200307~P~  
200408~20043~AUG-04~200308~k~  
200408~20043~AUG-04~200308~V~  
200408~20043~AUG-04~200308~P~  
200409~20043~SEP-04~200309~k~  
200409~20043~SEP-04~200309~V~  
200409~20043~SEP-04~200309~P~  
200410~20044~OCT-04~200310~k~  
200410~20044~OCT-04~200310~V~  
200410~20044~OCT-04~200310~P~  
200411~20044~NOV-04~200311~k~  
200411~20044~NOV-04~200311~V~  
200411~20044~NOV-04~200311~P~  
200412~20044~DEC-04~200312~k~  
200412~20044~DEC-04~200312~V~  
200412~20044~DEC-04~200312~P~  
谁能帮我解决这个问题。

告诉 在哪里停止匹配以及从哪里开始

sort -t$'~' -k1,1 -k5,5r filename
如果没有
,1
(和
,5
),第一次比较将从第1列运行到行尾

POSIX说:

符号:

-k field_start[type][,field_end[type]]
应定义一个从
字段开始
字段结束
的关键字段,除非
字段开始
超出行尾或在
字段结束
之后,在这种情况下,关键字段为空。缺少的
字段\u end
应表示该行的最后一个字符


为什么
q,p..
在最后一列
Z
之前?@Kent:区分大小写的ASCII(反向)顺序;小写字母的数字比大写字母大,所以这是正确的。+1但是我们真的
$'~'
吗我认为
排序-t'~'-k1,1-k5,5r文件也应该可以工作。你不需要
$'~'
'~'
也可以工作。我没有费心去纠正或注意到这一点。