扫描时态数据并在缺失日期时添加一行

扫描时态数据并在缺失日期时添加一行

问题描述:

我正在分析大时间系列数据文件(小时数据),并且必须在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,只是没有看到这样做的方式。如果你能点亮我会有很大的帮助!

谢谢你在前进, 爱丽丝

+0

什么编程语言,你知道吗?像Perl这样的东西对此非常有帮助。 – ruakh

+0

这个问题在http://unix.stackexchange.com/上更适合吗? – k0pernikus

+0

你在使用哪种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 
+0

谢谢Perreal。我明白了,但我仍然太新,无法处理循环和一切。你会在awk命令中实现吗?我很抱歉向你提出这样的基本问题,但我一直在努力与这些数据很长一段时间... – Alice

+0

@Alice,添加了一个脚本 – perreal

+0

好吧,因为它不直接工作,我会花更多的时间来获得在周末晚些时候进入它。我会让你知道的。非常感谢您的帮助,我交叉手指让它工作! – Alice