【问题标题】:Unix - Sorting file name with a key but not knowing its positionUnix - 使用键对文件名进行排序但不知道其位置
【发布时间】:2014-03-26 15:26:40
【问题描述】:

我想使用 Unix 命令对这些文件进行排序:

MyFile_fdfdsf_20140326.txt
MyFile_4fg5d6_20100301.csv
MyFile_dfgfdklm_19990101.tar.gz

我在这里等待的结果是MyFile_fdfdsf_20140326.txt

所以我想获取最新日期的文件。

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

任何帮助将不胜感激:)

【问题讨论】:

  • 日期是否总是在第二个_之后?
  • 感谢您的回答。这是完美的。但出于好奇,如果我有一个未知数量的“_”分隔符,但日期总是在最后一个“_”分隔符之后。 MyFile_abc_def_..._20140326.txt 排序 -t'_' -nk???文件
  • 查看我的更新答案。我介绍了这个具体案例。另外,它解决了你的问题吗?由于您是新来的,如果您的问题已经解决,请不要忘记将答案标记为已接受。您可以单击答案旁边的复选标记将其从空心切换为绿色。如有任何疑问,请参阅Help Center > Asking

标签: sorting unix filenames


【解决方案1】:

然后用-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, --numeric-sort

根据字符串数值比较

-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

【讨论】:

  • 但是 OP 说每个文件的日期可能在名称中的不同位置(尽管他在示例中未能证明这种可能性)。
  • 显然没问题,请参阅有关问题的 cmets。但是谢谢你让我知道,@dg99
猜你喜欢
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
相关资源
最近更新 更多