我正在尝试对目录中的文件进行排序,具体取决于文件名中附加的“日期字符串”,例如文件如下所示
SSA_F12_05122013.request.done
SSA_F13_12142012.request.done
SSA_F14_01062013.request.done
05122013,12142012和01062013表示格式的日期。
请帮我提供一个unix shell脚本来对这些文件中的日期字符串进行排序(按降序和升序排列)。
提前致谢。
答案 0 :(得分:2)
嗯...当sort
本身有能力定义究竟要排序的内容时,为什么要调用像awk和Perl这样的重量级人物?
ls SSA_F*.request.done | sort -k 1.13,1.16 -k 1.9,1.10 -k 1.11,1.12
每个-k
选项定义一个“排序键”:
-k 1.13,1.16
这定义了一个排序键,范围从字段1,第13列到第1列,第16列。(默认情况下,字段由空格分隔,文件名没有。)
如果文件名的长度不同,则将下划线定义为字段分隔符(使用-t
选项),然后在第三个字段中寻址列将是可行的方法。
有关详细信息,请参阅man sort
。使用-r
选项按降序排序。
答案 1 :(得分:0)
ls -lrt *.done | perl -lane '@a=split /_|\./,$F[scalar(@F)-1];$a[2]=~s/(..)(..)(....)/$3$2$1/g;print $a[2]." ".$_' | sort -rn | awk '{$1=""}1'
答案 2 :(得分:0)
使用awk和sort的一种方式:
ls -1|awk -F'[_.]' '{s=gensub(/^([0-9]{4})(.*)/,"\\2\\1","g",$3);print s,$0}'|sort|awk '$0=$NF'
如果我们将其分解:
ls -1|
awk -F'[_.]' '{s=gensub(/^([0-9]{4})(.*)/,"\\2\\1","g",$3);print s,$0}'|
sort|
awk '$0=$NF'
ls -1
只是一个例子。我想你有办法获得文件列表,每行一个。
稍微测试一下:
kent$ echo "SSA_F13_12142012.request.done
SSA_F12_05122013.request.done
SSA_F14_01062013.request.done"|awk -F'[_.]' '{s=gensub(/^([0-9]{4})(.*)/,"\\2\\1","g",$3);print s,$0}'|
sort|
awk '$0=$NF'
SSA_F13_12142012.request.done
SSA_F14_01062013.request.done
SSA_F12_05122013.request.done
答案 3 :(得分:0)
ls *.done | perl -pe 's/^.*_(..)(..)(....)/$3$2$1$&/' | sort -rn | cut -b9-
这会做+