【问题标题】:sorting list of files based upon the first numeric value根据第一个数值排序文件列表
【发布时间】:2013-02-07 14:08:42
【问题描述】:

我是 Unix 新手。我需要一些帮助来对文件名进行排序。我有一个文件列表如下:

FILE10_11_9_1_C.sql 
FILE11_11_9_1_P.sql 
LE12_11-9-1-P.sql 
FILE13_11-9-1-P.sql 
FILE14_11_9_1_P.sql 
E15_11_9_1_P.sql 
FILE16_11_9_1_P.sql 
FILE17_11_9_1_U.sql 
FILE17_11_9_1_U.sql 
FILE5_11_9_1_A.sql 
FILE7_PKG_C.sql 
FILE8_PKG_CV.sql 
Fi1_11_9_1_E.sql 
File2_11_9_1_E.sql 
File3_11_9_1_C.sql 
FILE4_11_9_1_P.sql 

我想对它进行数字排序,直到遇到第一个下划线(数字可以在任何位置,而不是在第 5 位)。例如-如下:

File1_11_9_1 
File2_11_9_1 
. 
. 
. 
File8_Pkg 
File10_11_9_1 

我正在尝试ls -1|sort -t"_" -k1,4n 但这似乎不起作用。

【问题讨论】:

标签: shell unix sorting sed awk


【解决方案1】:
$ sort -k1.5n file
File1_11_9_1_E.sql
File2_11_9_1_E.sql
File3_11_9_1_C.sql
FILE4_11_9_1_P.sql
FILE5_11_9_1_A.sql
FILE7_PKG_C.sql
FILE8_PKG_CV.sql
FILE10_11_9_1_C.sql
FILE11_11_9_1_P.sql
FILE12_11-9-1-P.sql
FILE13_11-9-1-P.sql
FILE14_11_9_1_P.sql
FILE15_11_9_1_P.sql
FILE16_11_9_1_P.sql
FILE17_11_9_1_U.sql
FILE17_11_9_1_U.sql

【讨论】:

  • 它只是从第一个字段的第 5 个字符 (-k1.5) 开始以数字 (n) 排序,因此它会跳过单词“file”然后以数字排序。
  • 我在info sort 中找到了解释man sort 中没有描述此功能(字符和字段)。当然让很多任务更容易!我已经 +1 了。
  • .符号在 man 文件中进行了描述,尽管很简洁,并且在选项列表之后:“POS 是 F[.C][OPTS],其中 F 是字段编号,C 是字段中的字符位置;两者都是原点 1。”鉴于 POS 仅与 -k 选项一起使用,我不知道他们为什么在 -k 的描述中省略了这一点,以便稍后说明。
  • +1 @sudo_O 在我的手册页中,我可以在 nr 80 行看到它。你可以手动排序,然后输入80G
  • @Kent 原来如此,我从未注意到它,因为它不在-k 的选项描述下。以后必须阅读完整的手册页!
【解决方案2】:

尝试ls -1 | sort -t _ -k1.5,1n这个排序在第5个字符前。

【讨论】:

    【解决方案3】:

    好吧,我有点懒得记住排序花哨的选项。

    只需结合 linux power text handlers 来实现它。必须有更优雅的方式来做到这一点。但这不需要太多思考就可以工作

    your ls...|awk -F'[Ee_]' '{print $2" "$0}'|sort -n|sed -r 's/[0-9]+ //'
    

    编辑

    添加一个纯 awk 单行代码:

    ls...|awk -F'[Ee_]' '{a[NR]=$2;b[$2]=$0;}END{n=asort(a);for(i=1;i<=n;i++)print b[a[i]]}'
    

    像这样工作:

    kent$  echo "FILE10_11_9_1_C.sql 
    FILE11_11_9_1_P.sql 
    FILE12_11-9-1-P.sql 
    FILE13_11-9-1-P.sql 
    FILE14_11_9_1_P.sql 
    FILE15_11_9_1_P.sql 
    FILE16_11_9_1_P.sql 
    FILE17_11_9_1_U.sql 
    FILE17_11_9_1_U.sql 
    FILE5_11_9_1_A.sql 
    FILE7_PKG_C.sql 
    FILE8_PKG_CV.sql 
    File1_11_9_1_E.sql 
    File2_11_9_1_E.sql 
    File3_11_9_1_C.sql 
    FILE4_11_9_1_P.sql"|awk -F'[Ee_]' '{print $2" "$0}'|sort -n|sed -r 's/[0-9]+ //' 
    File1_11_9_1_E.sql 
    File2_11_9_1_E.sql 
    File3_11_9_1_C.sql 
    FILE4_11_9_1_P.sql
    FILE5_11_9_1_A.sql 
    FILE7_PKG_C.sql 
    FILE8_PKG_CV.sql 
    FILE10_11_9_1_C.sql 
    FILE11_11_9_1_P.sql 
    FILE12_11-9-1-P.sql 
    FILE13_11-9-1-P.sql 
    FILE14_11_9_1_P.sql 
    FILE15_11_9_1_P.sql 
    FILE16_11_9_1_P.sql 
    FILE17_11_9_1_U.sql 
    FILE17_11_9_1_U.sql 
    

    【讨论】:

      【解决方案4】:

      假设您的文件名不以数字开头,这是使用GNU awk 的一种方法。它将按下划线前的第一个数字排序,然后按出现顺序排序。同样一般来说,解析lsa bad idea,尽管它可以与您的文件名“工作”。我更喜欢使用GNU find。运行如下:

      awk -f script.awk <(find ./* -maxdepth 1 -type f -name "*.sql" -printf "%f\n")
      

      script.awk的内容:

      BEGIN {
          FS="[^0-9]+"
      }
      
      {
          a[$2] = (a[$2] ? a[$2] ORS : "") $0
      }
      
      END {
          for (i in a) {
              b[j++]=i+0
          }
      
          n = asort(b)
      
          for (k=1;k<=n;k++) {
              print a[b[k]]
          }
      }
      

      结果:

      Fi1_11_9_1_E.sql 
      File2_11_9_1_E.sql 
      File3_11_9_1_C.sql 
      FILE4_11_9_1_P.sql 
      FILE5_11_9_1_A.sql 
      FILE7_PKG_C.sql 
      FILE8_PKG_CV.sql 
      FILE10_11_9_1_C.sql 
      FILE11_11_9_1_P.sql 
      LE12_11-9-1-P.sql 
      FILE13_11-9-1-P.sql 
      FILE14_11_9_1_P.sql 
      E15_11_9_1_P.sql 
      FILE16_11_9_1_P.sql 
      FILE17_11_9_1_U.sql 
      FILE17_11_9_1_U.sql
      

      或者,这里是单行:

      awk -F "[^0-9]+" '{ a[$2] = (a[$2] ? a[$2] ORS : "") $0 } END { for (i in a) b[j++]=i+0; n = asort(b); for (k=1;k<=n;k++) print a[b[k]] }' <(find ./* -maxdepth 1 -type f -name "*.sql" -printf "%f\n")
      

      【讨论】:

        猜你喜欢
        • 2015-10-09
        • 2017-01-02
        • 1970-01-01
        • 2014-12-02
        • 2014-11-29
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        相关资源
        最近更新 更多