在不丢失原始排序顺序的情况下进行子排序?

时间:2017-10-30 14:19:24

标签: linux bash sorting

我在一个文件夹中有一堆文件,其常见的命名结构如下所示:

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等。)

2 个答案:

答案 0 :(得分:3)

您可以尝试-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

答案 1 :(得分:1)

dir或ls也没关系

dir -1v *.pdf

ls -1v *.pdf