【问题标题】:Sort Delimited file column wise对分隔文件列进行排序
【发布时间】:2013-09-11 00:37:38
【问题描述】:

我的输入文件如下所示,我需要根据分隔符“~”对这个文件进行排序,即第 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~  

谁能帮我解决这个问题。

【问题讨论】:

  • 为什么q,p.. 在最后一列的Z 之前?
  • @Kent:区分大小写的 ASCII(反向)顺序;小写字母的数字大于大写字母,所以这是正确的。

标签: unix sorting sed awk


【解决方案1】:

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

sort -t$'~' -k1,1 -k5,5r filename

没有,1(和,5),第一个比较从第1列到行尾。

POSIX 说:

符号:

-k field_start[type][,field_end[type]]

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

【讨论】:

  • +1 但我们真的$'~' 我认为sort -t '~' -k1,1 -k5,5r file 也应该工作。
  • 您不需要 $'~''~' 就可以了。我没有费心纠正或注意到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2013-06-30
  • 2013-08-24
相关资源
最近更新 更多