从日期块中提取第一行,增加一天

时间:2018-01-11 22:36:51

标签: linux shell

我有一个只有日期列的文件。我正在尝试编写一个shell脚本,只有当下一个 n 行的数量比上一个日期增加一天时才会提取日期。在下面的示例中, n 仅限于5。

我是使用awksed命令的新手,所以这是我使用基本命令的方法。 while循环中的多个条件似乎不起作用。

代码:

#!/bin/sh

set -f
set -xv
exec 2>/myLog.txt
file="file1.txt"
counter=1
limit=5
while ((( $counter < $limit )) || (read Line));
do
    a=$Line
    for ((i=1;i<=$limit;i++));
    do
        read Line
        b=$Line
        if [ $a != `date --date="$b -1 day" '+%Y-%m-%d'` ]; then
            a=$b
        $i=0
        $counter=1
        else
        a=$b
        #read Line
        ((counter++))
        echo "$counter"
        fi
done

done < $file

FILE1.TXT:

2000-04-03
2000-05-04
2000-06-03
2000-06-30
2000-10-14
2000-10-15
2000-10-16
2000-10-17
2000-10-18
2000-10-19
...
..
.

Output.txt的

2000-10-14

2 个答案:

答案 0 :(得分:0)

numintervaldatepasteuniqsed的混搭:

# fake `numinterval` function, uncomment if `num-utils` can't be installed
# numinterval() { printf '%s %s r - p\n' $(sed '1!{$!p}') | dc ; }

date -f file1.txt '+%s' | numinterval | paste file1.txt - | 
uniq -f 1 | sed -n '/\t86400$/s/\t.*//p'

输出:

2000-10-14

工作原理:

  1. 将所有日期转换为秒,(%s表示自1970-01-01 00:00:00 UTC“以来”秒,并使用{{1}输出一个 差异列表。 numinterval的输出是:

    date -f file1.txt '+%s' | numinterval
  2. 2678400 2592000 2332800 9158400 86400 86400 86400 86400 86400 日期和时间间隔。
  3. 使用paste删除 2nd 字段中具有重复间隔的一系列行中的第一行,(uniq -f 1跳过 1st field),
  4. 使用-f 1查找任何尾随 86,400 ,(以秒为单位) 一天),然后删除sed离开前一个日期字段,即86400 rint ed。

答案 1 :(得分:0)

min_array=()
prev=""
i=0
limit=30
while read LINE
do
     curr=$LINE
     [ "$prev" = ""  ] && prev="$curr"  && continue  # next line 

     [ `date --date="$curr -1 day" '+%Y-%m-%d'` != "$prev"  ] && i=0 || ((i++))

if (("$i"==1)); then min_array=($prev); fi

     if (("$i"==30)); then echo "${min_array[*]}"; exit; fi

     prev="$curr"
done <$file