我有一个只有日期列的文件。我正在尝试编写一个shell脚本,只有当下一个 n 行的数量比上一个日期增加一天时才会提取日期。在下面的示例中, n 仅限于5。
我是使用awk
和sed
命令的新手,所以这是我使用基本命令的方法。 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
答案 0 :(得分:0)
numinterval
,date
,paste
,uniq
和sed
的混搭:
# 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
工作原理:
将所有日期转换为秒,(%s
表示自1970-01-01 00:00:00 UTC“以来”秒,并使用{{1}输出一个
差异列表。 numinterval
的输出是:
date -f file1.txt '+%s' | numinterval
2678400
2592000
2332800
9158400
86400
86400
86400
86400
86400
日期和时间间隔。paste
删除 2nd 字段中具有重复间隔的一系列行中的第一行,(uniq -f 1
跳过 1st field),-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