根据ksh脚本中的日期选择文件

时间:2014-07-24 14:47:39

标签: shell unix

我有这个文件列表。现在我将不得不根据某些条件选择最新的文件

   3679 Jul 21 23:59 belk_rpo_error_**po9324892**_07212014.log
   0    Jul 22 23:59 belk_rpo_error_**po9324892**_07222014.log
   3679 Jul 23 23:59 belk_rpo_error_**po9324892**_07232014.log
     22 Jul 22 06:30 belk_rpo_error_**po9324267**_07012014.log
      0 Jul 20 05:50 belk_rpo_error_**po9999992**_07202014.log
    411 Jul 21 06:30 belk_rpo_error_**po9999992**_07212014.log
    742 Jul 21 07:30 belk_rpo_error_**po9999991**_07212014.log
      0 Jul 23 2014  belk_rpo_error_**po9999991**_07232014.log

对于PATRICULAR Order_No(标有** **)

  1. 如果最新文件是0 kB,那么我们将丢弃它(其余的文件也具有相同的Order_no)
  2. 如果最新的文件非零,那么我会接受它。(只有最新的文件)
  3. 然后将内容附加到txt文件中。 我的预期输出是::

       411 Jul 21 06:30 belk_rpo_error_**po9999992**_07212014.log
       3679 Jul 23 23:59 belk_rpo_error_**po9324892**_07232014.log
        22 Jul 22 06:30 belk_rpo_error_**po9324267**_07012014.log
    

    我在这里结束了我的智慧。我似乎无法弄清楚如何在Unix中比较日期。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以尝试以下内容:

touch test.txt
for var in ` find . ! -empty -exec ls -r {} \;`
do
    cat $var>>test.txt
done

答案 1 :(得分:1)

未测试

使用stat发出日期(纪元时间),大小和文件名 使用awk过滤掉零长度文件并提取订单号 按订单号和日期排序
awk获取每个订单号的最后一个文件名

stat -c $'%Y\t%s\t%n' *.log | 
awk -F'\t' -v OFS='\t' '
    $2 > 0 {
        split($3, a, /_/)
        print a[4], $1, $3
    }' |
sort -t $'\t' -k1,1 -k2,2n |
awk -F'\t' '
    NR > 1 && $1 != prev_order {print filename}
    {filename = $3; prev_order = $1}
    END {print filename}
' 

sort命令可能是错误的:为了按订单号分组,您可能需要先按文件时间排序,然后按订单号排序。

如果我理解您的问题,则需要将生成的文件连接起来并附加到文件中。如果上面的管道工作正常,那么管道进入| xargs cat >> something.log