的Unix - 排序文件名以一个密钥,但不知道它的位置

问题描述:

我想使用Unix的这些文件进行排序命令:的Unix - 排序文件名以一个密钥,但不知道它的位置

MyFile_fdfdsf_20140326.txt 
MyFile_4fg5d6_20100301.csv 
MyFile_dfgfdklm_19990101.tar.gz 

我等待这里的结果MyFile_fdfdsf_20140326.txt

所以我d喜欢用最新的日期获取文件。

我不能使用'sort -k',因为键的位置(日期)可能有所不同 但是在我的文件名中,总是有两个“_”分隔符和一个点'。'。文件扩展

任何帮助,将不胜感激:)

+0

是始终之后的第二'日期_'? – fedorqui

+0

谢谢你的回答。这是完美的。 但出于好奇,如果我有一个未知数的“\ _”分隔符,但该日期总是在最后一个“\ _”分隔符之后。 MyFile_abc_def _..._ 20140326.txt sort -t'_'-nk ???文件 – user3464809

+0

查看我更新的答案。我介绍了这个具体案例。另外,它解决了你的问题?既然你是新来的,如果你的问题已经解决了,请不要忘记标记答案。您可以点击答案旁边的复选标记将其从空心切换为绿色。如果您有任何疑问,请参阅[帮助中心>提问](http://*.com/helpcenter/someone-answers)! – fedorqui

然后使用-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分离器SEP =

使用SEP代替非空白到空白转变

-n,--numeric排序

比较根据字符串数值

-r,--reverse

反转比较

的结果

更新

谢谢你的回答。这是完美的。但出于好奇,如果 我有一个未知数量的分隔符,但日期总是在最后一个“_”分隔符 之后。 MyFile_abc_def _... 20140326.txt sort -t'' -nk ???文件 - 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 
+0

但是OP在说每个文件可能在名称中有不同位置的日期(尽管他在他的例子中证明了这种可能性做得不好)。 – dg99

+0

显然这很好,请参阅有关问题的评论。但是谢谢你让我知道,@ dg99 – fedorqui