如何在shell脚本中对文件名中的时间戳进行排序

时间:2014-03-05 04:20:33

标签: linux oracle shell

如何对_tm1.csv之前的最旧到最新的时间戳进行排序,时间戳总是在_tm1.csv之前,如果_是分隔符,那就是第二个最后一个段,它将是时间戳。< / p>

alex_li_20140301121212_tm1.csv
alex_cf_li_20140302121212_tm1.csv
B_A_cf_li_20140303121212_tm1.csv

3 个答案:

答案 0 :(得分:0)

您可以使用:

awk -F_ '{print $(NF-1), $0}' file | sort -nk1 | cut -d' ' -f2-
alex_li_20140301121212_tm1.csv
alex_cf_li_20140302121212_tm1.csv
B_A_cf_li_20140303121212_tm1.csv

答案 1 :(得分:0)

ls | sed 's/^.*_\([0-9]\+\)_.*$/\1,\0/' | sort -g | cut -d, -f 2

答案 2 :(得分:0)

以下是使用GNU awk的一体化解决方案:

awk -F_ '{
  ts[$(NF-1),$0]++
}
END {
  n = asorti(ts, ts_s);
  for(x = 1; x <= n; x++) {
    split(ts_s[x], tmp, SUBSEP);
      print tmp[1], tmp[2]
  }
}' file
如果您愿意,可以使用

或单行:

awk -F_ '{ts[$(NF-1),$0]++}END{n=asorti(ts,ts_s);for(x=1;x<=n;x++){split(ts_s[x],tmp,SUBSEP);print tmp[1],tmp[2]}}' file

输出(我修改了输入文件以演示排序)

$ cat file
alex_li_20140301121212_tm1.csv
alex_cf_li_20130302121212_tm1.csv
B_A_cf_li_20120303121212_tm1.csv

$ awk -F_ '{ts[$(NF-1),$0]++}END{n=asorti(ts,ts_s);for(x=1;x<=n;x++){split(ts_s[x],tmp,SUBSEP);print tmp[1],tmp[2]}}' file
20120303121212 B_A_cf_li_20120303121212_tm1.csv
20130302121212 alex_cf_li_20130302121212_tm1.csv
20140301121212 alex_li_20140301121212_tm1.csv

如果输出中不需要timestamp,则可以执行print tmp[2]。像:

$ awk -F_ '{ts[$(NF-1),$0]++}END{n=asorti(ts,ts_s);for(x=1;x<=n;x++){split(ts_s[x],tmp,SUBSEP);print tmp[2]}}' file
B_A_cf_li_20120303121212_tm1.csv
alex_cf_li_20130302121212_tm1.csv
alex_li_20140301121212_tm1.csv