【问题标题】:Sub-sorting without losing original sort order?在不丢失原始排序顺序的情况下进行子排序?
【发布时间】:2023-03-28 19:08:01
【问题描述】:

我在一个文件夹中有一堆文件,它们的命名结构看起来像这样:

FOOBAR_1A.8_Alice.pdf
FOOBAR_1A.9_Bob.pdf
FOOBAR_1B.10_Foo.pdf
FOOBAR_1B.11_Bar.pdf
FOOBAR_1B.12_Jack.pdf
FOOBAR_1B.1_Jill.pdf
FOOBAR_1B.2_John.pdf
FOOBAR_1B.3_Mary.pdf

为了实现上述排序顺序,我进行了第一次排序迭代,如下所示:

find . -type f -name "*.pdf" -print | cut -d'/' -f2 | sort

但是如您所见,10/11/12 打印在 1/2/3 之前。

我再次尝试通过管道重新排序:

find . -type f -name "*.pdf" -print | cut -d'/' -f2 | sort | sort -t '.' -k 2n

但是这会打乱之前的排序工作并打印如下所示的输出:

FOOBAR_1A.7_Alice.pdf
FOOBAR_1B.7_Bob.pdf
FOOBAR_2A.7_John.pdf
FOOBAR_2B.7_Mary.pdf
FOOBAR_2C.7_Foo.pdf
FOOBAR_1A.8_Bar.pdf
FOOBAR_1B.8_Jack.pdf
FOOBAR_2A.8_Jill.pdf

所以,总而言之,我想要的排序输出是:

  1. FOOBAR_NA.N 的第一个字符应按数字排序(即FOOBAR_1 然后FOOBAR_2 等)
  2. 然后FOOBAR_NA.N 应按字母顺序按第二个字符排序(即FOOBAR_1A 然后FOOBAR_1B 等)
  3. FOOBAR_NA.N 最后应该按第一个点之后的数字排序(即FOOBAR_1A.1 然后FOOBAR_1A.2 等)

【问题讨论】:

    标签: linux bash sorting


    【解决方案1】:

    你可以试试-V(按版本排序):

    find . -name '*.pdf' | cut -d'/' -f2 | sort -t _ -k2V
    
    FOOBAR_1A.8_Alice.pdf
    FOOBAR_1A.9_Bob.pdf
    FOOBAR_1B.1_Jill.pdf
    FOOBAR_1B.2_John.pdf
    FOOBAR_1B.3_Mary.pdf
    FOOBAR_1B.10_Foo.pdf
    FOOBAR_1B.11_Bar.pdf
    FOOBAR_1B.12_Jack.pdf
    

    【讨论】:

      【解决方案2】:

      dir 或 ls 也可以

      dir -1v *.pdf
      

      或

      ls -1v *.pdf
      

      【讨论】:

      • 不错!好主意,又好又短!但假设 GNU dir/ls 为 -v natural sort of (version) numbers within text。 BSD 是-v Force unedited printing of non-graphic characters; this is the default when output is not to a terminal.。因此,较长的剪切/排序版本更“便携”。我仍然会给你+1! :)
      猜你喜欢
      • 2018-11-16
      • 2020-11-12
      • 2016-04-24
      • 1970-01-01
      • 2020-09-13
      • 2018-05-20
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      相关资源
      最近更新 更多