-1

我正在分析大时间序列数据文件(每小时数据),并且必须在 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

看到有一个数据丢失了 5/3/03 下午 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 的新手,只是不知道该怎么做。如果你能点亮我,那将有很大的帮助!

提前谢谢你,爱丽丝

4

1 回答 1

1

给定一个日期,您可以获得下一个预期日期,如下所示:

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")

所以,读完一行后,如果 previousndate不等于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
于 2013-06-21T21:59:11.647 回答