我有一个文件数组(带有路径,删除了路径,并为敏感材料略微修改了文件名),在这里我想按文件名中的日期排序(但首先将所有前缀排序在一起)
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
在这里,它们是按前缀排序的,我该如何按日期排序呢?
我想到的方法是保存不带前缀的名称,但是问题是使前缀重新正确显示。(我也需要看到前缀)
奖励,但不是根据需要:用“ -----”分隔不同的日期(不是小时)
另一个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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句