当文件在bash中有不同的前缀时,如何按文件名中的日期排序?

时间:2016-05-13 16:08:55

标签: bash

我有一个文件数组(路径,路径被移除,文件名略微修改为敏感材料),我想按文件名中的日期排序(但它首先将所有前缀排序在一起)

A_20160406_161734_083.txt
A_20160406_162033_756.txt
A_20160406_182413_069.txt
A_20160426_093015_846.txt
S_20160406_161741_568.txt
S_20160406_185235_774.txt
S_20160426_093019_852.txt
D__20160407_125904_986.txt
D__20160422_163704_889.txt
D__20160422_173021_513.txt
D__20160422_185627_116.txt
D__20160425_175231_627.txt
D__20160425_210242_615.txt
D__20160426_092631_837.txt
D__20160503_161921_802.txt
D__20160512_122039_138.txt
C_20160406_185205_258.txt
C_20160426_092920_788.txt

这里他们按前缀排序,我怎样才能按日期排序?

我想到的方法是保存没有前缀的名称,但问题是正确地重新获得前缀。 (我也需要看到前缀)

奖金但不是必要的:用'-----'

分隔不同的日期(不是小时)

1 个答案:

答案 0 :(得分:2)

另一个sed解决方案

sed -r 's/(_+)/\1 /' file | sort -k2 | sed 's/_ /_/'

将第一个可能重复的_字符分开,排序,重新加入。

  

sed -r 's/(_+)/\1 /'件:(_+)取第一个(通知无g后缀)最长_(因为贪婪)字符串分配给组\1替换第一个匹配的组(即_字符串)和空格。

     

sed 's/_ /_/'将第一个_(下划线空格)匹配替换为_(仅限下划线),意味着删除空格。

将sed输出传递给

... |  awk -F'_+' 'p!=$2{if(NR>1)print "------";p=$2}1'

A_20160406_161734_083.txt
S_20160406_161741_568.txt
A_20160406_162033_756.txt
A_20160406_182413_069.txt
C_20160406_185205_258.txt
S_20160406_185235_774.txt
------
D__20160407_125904_986.txt
------
D__20160422_163704_889.txt
D__20160422_173021_513.txt
D__20160422_185627_116.txt
------
D__20160425_175231_627.txt
D__20160425_210242_615.txt
------
D__20160426_092631_837.txt
C_20160426_092920_788.txt
A_20160426_093015_846.txt
S_20160426_093019_852.txt
------
D__20160503_161921_802.txt
------
D__20160512_122039_138.txt

整个事情也可以转换为gawk。