我想使用Unix命令对这些文件进行排序:
MyFile_fdfdsf_20140326.txt
MyFile_4fg5d6_20100301.csv
MyFile_dfgfdklm_19990101.tar.gz
我在这里等待的结果是MyFile_fdfdsf_20140326.txt
所以我想获得最新日期的文件。
我不能使用'sort -k',因为键的位置(日期)可能会有所不同 但在我的文件名中总有两个“_”分隔符和一个点“。”用于文件扩展名
任何帮助将不胜感激:)
答案 0 :(得分:0)
然后使用-t
表示字段分隔符并将其设置为_
:
sort -t'_' -k3
请参阅文件名的排序示例(如果文件名在文件中)。我使用-n
进行数字排序,使用-r
进行反向排序:
$ sort -t'_' -nk3 file
MyFile_dfgfdklm_19990101.tar.gz
MyFile_4fg5d6_20100301.csv
MyFile_fdfdsf_20140326.txt
$ sort -t'_' -rnk3 file
MyFile_fdfdsf_20140326.txt
MyFile_4fg5d6_20100301.csv
MyFile_dfgfdklm_19990101.tar.gz
来自man sort
:
-t , - field-separator = SEP
使用SEP代替非空白到空白转换
-n , - 数字排序
根据字符串数值进行比较
-r , - 反向
反转比较结果
谢谢你的回答。它非常完美。但出于好奇,如果 我有一个未知数量的分隔符,但日期总是在之后 最后一个" _"分隔符。 MyFile_abc_def _... 20140326.txt sort -t' ' -NK ??? file - user3464809
您可以稍微欺骗它:打印最后一个字段,排序然后将其删除。
awk -F_ '{print $NF, $0}' a | sort | cut -d'_' -f2-
查看示例:
$ cat a
MyFile_fdfdsf_20140326.txt
MyFile_4fg5d6_20100301.csv
MyFile_dfgfdklm_19990101.tar.gz
MyFile_dfgfdklm_asdf_asdfsadfas_19940101.tar.gz
MyFile_dfgfdklm_asdf_asdfsadfas_29990101.tar.gz
$ awk -F_ '{print $NF, $0}' a | sort | cut -d'_' -f2-
dfgfdklm_asdf_asdfsadfas_19940101.tar.gz
dfgfdklm_19990101.tar.gz
4fg5d6_20100301.csv
fdfdsf_20140326.txt
dfgfdklm_asdf_asdfsadfas_29990101.tar.gz