扫描时态数据并在缺失日期时添加一行
问题描述:
我正在分析大时间系列数据文件(小时数据),并且必须在UNIX上相互比较它们。如果每个文件中的相同行具有相同的日期和小时,这将很容易。但是,某些文件中缺少一些数据,这使得来自不同文件的行在时间上不匹配。因此,我想要做的是扫描我的数据文件中的日期,并在缺少一小时时添加一行。下面的例子可以帮助理解:扫描时态数据并在缺失日期时添加一行
这是原始文件:
5/3/03,11:00 AM,2.62,,30.11
5/3/03,12:00 PM,2.63,,31.92
5/3/03,1:00 PM,2.6,,37.09
5/3/03,3:00 PM,2.54,,36.46
看到有一个数据丢失的03年5月3日下午2点。因此什么我想要做的就是添加,只有日线,才能获得:
5/3/03,11:00 AM,2.62,,30.11
5/3/03,12:00 PM,2.63,,31.92
5/3/03,1:00 PM,2.6,,37.09
5/3/03,2:00 PM,,,
5/3/03,3:00 PM,2.54,,36.46
我在新的Unix,只是没有看到这样做的方式。如果你能点亮我会有很大的帮助!
谢谢你在前进, 爱丽丝
答
给定一个日期,你可以得到这样的一个预期的日期:
cdate=$(echo "5/3/03,11:00 AM,2.62,,30.11" | cut -d, -f1,2) # from file
ndate=$(date +"%m/%d/%y,%I:%M %p" -d "${cdate/,/ } +1 hours")
所以,你看行后,如果以前ndate
不等于到cdate
,在循环中写出ndate
。当它们匹配时,写出该行。
使用GNU日期bash脚本:
#!/bin/bash
ndate=""
while read line; do
cdate=$(echo $line | cut -d, -f1,2) # from file
#echo $cdate $ndate
if [[ "$ndate" == "" || "$ndate" == "$cdate" ]]; then
echo $line
else
while [[ $ndate != $cdate ]]; do
echo "$ndate,,,"
ndate=$(date +"%-m/%-d/%y,%-I:%M %p" -d "${ndate/,/ } +1 hours")
done
echo $line
fi
ndate=$(date +"%-m/%-d/%y,%-I:%M %p" -d "${cdate/,/ } +1 hours")
done < input
什么编程语言,你知道吗?像Perl这样的东西对此非常有帮助。 – ruakh
这个问题在http://unix.stackexchange.com/上更适合吗? – k0pernikus
你在使用哪种UNIX? –