如何获得比linux中提供的日期更小/更少的数据

时间:2017-05-01 02:54:06

标签: linux unix

我有sample.txt文件,其中文件中的数据如下所示:

LINE 1|2017-02-19|LINE 3|LINE 4| LINE 5 | LINE 6
LINE 1|2017-02-06|LINE 3|LINE 4| LINE 5 | LINE 6
LINE 1|2017-03-06|LINE 3|LINE 4| LINE 5 | LINE 6
LINE 1|2017-02-07|LINE 3|LINE 4| LINE 5 | LINE 6
LINE 1|2017-03-25|LINE 3|LINE 4| LINE 5 | LINE 6
LINE 1|2017-02-06|LINE 3|LINE 4| LINE 5 | LINE 6

现在我想从sample.txt文件中获取数据

2017-02-19
2017-02-06
2017-03-06
2017-02-07    
2017-03-25
2017-02-06

            > 2017-02-19

所以我的输出应该看起来像

LINE 1|2017-03-06|LINE 3|LINE 4| LINE 5 | LINE 6
LINE 1|2017-03-25|LINE 3|LINE 4| LINE 5 | LINE 6

2 个答案:

答案 0 :(得分:1)

使用GNU awkdate

  • field separator FS设为|
  • date -d[DATE] +[OUTPUT_FORMAT]…会将字段2($2)格式化为自 unix epoch %s)以来的秒数并将其传递给变量d
  • Awk将测试d小于2017-02-19,其中纪元为1487480400后的秒数,如果为真将打印整个记录{{ 1}}

代码

$0

注意:您可以通过将awk 'BEGIN{FS="|";} { "date -d"$2" +%s" | getline d;} d < 1487480400 { print $0; }' 更改为print $0;print $1;甚至print $1,$2;


查找自给定日期的Unix纪元以来的秒数

例如,您可以在命令行中使用print $1"anythingYouWantHereQuoted"$2;找到自Unix纪元以来的秒数。

答案 1 :(得分:0)

逐行读取文件, 隔离日期, 比较日期(格式化为数字), 跳过该行,或打印该行

#!/bin/ksh

compareDay=$( date -d '2017-02-19' "+%Y%j" )    # build a number from <year><day of year>
cat sample.txt | while read line; do
    day="${line#*\|}"           # remove from the beginning to first |
    day="${day%%\|*}"           # remove from the end (%%=all) up from |
    # compare, skip if condition not met
    [[ $( date -d $day "+%Y%j" ) -gt $compareDay ]] || continue
    echo "$line"                # output the remaining line meeting the condition
done

这假设您可能必须处理第一列中具有不同值的输入。否则,@ bren的解决方案就足够了。

哪个在ksh中

cat sample.txt | while read line; do
    [[ $line > 'LINE 1|2017-02-20' ]] || continue
    echo "$line"
done