我有一个文件数组(路径,路径被移除,文件名略微修改为敏感材料),我想按文件名中的日期排序(但它首先将所有前缀排序在一起)
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
这里他们按前缀排序,我怎样才能按日期排序?
我想到的方法是保存没有前缀的名称,但问题是正确地重新获得前缀。 (我也需要看到前缀)
奖金但不是必要的:用'-----'
分隔不同的日期(不是小时)答案 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。