将日期和时间戳转换为不同的格式
converting date and timestamp to to different format
专家们我将三列数据(date, timing, extrainfo
)保存在一个名为inputdata.file.
的文本文件中
在一个循环中,我想按行读取数据,并想从第一列数据中打印 yearjulianday。
其次,对于第二列数据,我想以 hour minute second
格式打印输出,但在这里我想减去 60
秒,并希望以相同的 hour
minute second
format.Additionally, 我不想对第三列做任何操作。
例如,在下面的附加数据中,第一行包含 2019-01-02 07:41:26.225000 5.49.
从这个数据开始,我只想将 2019-01-02 转换为 2019+它的儒略日,即 2019002。
其次 07:41:26.225000 应在扣除 60 秒后转换为相同的 hr:min:sec 格式,即 07:40:26.225000 。对于其他行,我也想这样做。
2019-01-02 07:41:26.225000 5.49
2019-01-05 19:43:54.185000 5
2019-01-07 19:05:21.165000 5.18
预期输出
2019-01-02 07:41:26.225000 5.49 2019002 07:40:26.225000
2019-01-05 19:43:54.185000 5 2019005 19:42:54.185000
2019-01-07 19:05:21.165000 5.18 2019007 19:04:21.165000
我试过如下脚本:
while read -r line;
do
echo "$line" ;
awk '{print }'
done < inputdata.file
然而,由于我是 shell 脚本编写的新手,所以对 this.Please help.Thanks 了解不多。
while IFS= read -r line ; do
read -r date time extra <<<"$line"
IFS=. read -r hms fraction <<<"$time"
newtimestamp=$(date -d "$hms $date -60 seconds" '+%Y%j %T')
printf '%s %s.%s\n' "$line" "$newtimestamp" "$fraction"
done < file | column -t
column
添加以美化输出:如果不需要,请将其删除。
我在输出中添加了额外的一行,以表明您必须从日期和时间中减去 60 秒。
输入:
2019-01-02 07:41:26.225000 5.49
2019-01-05 19:43:54.185000 5
2019-01-07 19:05:21.165000 5.18
2020-01-01 00:00:01.0 foobar
输出:
2019-01-02 07:41:26.225000 5.49 2019002 07:40:26.225000
2019-01-05 19:43:54.185000 5 2019005 19:42:54.185000
2019-01-07 19:05:21.165000 5.18 2019007 19:04:21.165000
2020-01-01 00:00:01.0 foobar 2019365 23:59:01.0
将 GNU awk 用于时间函数和 gensub():
$ cat tst.awk
BEGIN { OFS="\t" }
{
secs = mktime(gensub(/[-:]/," ","g"," "))
ms = gensub(/.*\./,"",1,)
print " ", , strftime("%Y%j",secs), strftime("%T.",secs-60) ms
}
$ awk -f tst.awk file
2019-01-02 07:41:26.225000 5.49 2019002 07:40:26.225000
2019-01-05 19:43:54.185000 5 2019005 19:42:54.185000
2019-01-07 19:05:21.165000 5.18 2019007 19:04:21.165000
专家们我将三列数据(date, timing, extrainfo
)保存在一个名为inputdata.file.
在一个循环中,我想按行读取数据,并想从第一列数据中打印 yearjulianday。
其次,对于第二列数据,我想以 hour minute second
格式打印输出,但在这里我想减去 60
秒,并希望以相同的 hour
minute second
format.Additionally, 我不想对第三列做任何操作。
例如,在下面的附加数据中,第一行包含 2019-01-02 07:41:26.225000 5.49.
从这个数据开始,我只想将 2019-01-02 转换为 2019+它的儒略日,即 2019002。
其次 07:41:26.225000 应在扣除 60 秒后转换为相同的 hr:min:sec 格式,即 07:40:26.225000 。对于其他行,我也想这样做。
2019-01-02 07:41:26.225000 5.49
2019-01-05 19:43:54.185000 5
2019-01-07 19:05:21.165000 5.18
预期输出
2019-01-02 07:41:26.225000 5.49 2019002 07:40:26.225000
2019-01-05 19:43:54.185000 5 2019005 19:42:54.185000
2019-01-07 19:05:21.165000 5.18 2019007 19:04:21.165000
我试过如下脚本:
while read -r line;
do
echo "$line" ;
awk '{print }'
done < inputdata.file
然而,由于我是 shell 脚本编写的新手,所以对 this.Please help.Thanks 了解不多。
while IFS= read -r line ; do
read -r date time extra <<<"$line"
IFS=. read -r hms fraction <<<"$time"
newtimestamp=$(date -d "$hms $date -60 seconds" '+%Y%j %T')
printf '%s %s.%s\n' "$line" "$newtimestamp" "$fraction"
done < file | column -t
column
添加以美化输出:如果不需要,请将其删除。
我在输出中添加了额外的一行,以表明您必须从日期和时间中减去 60 秒。
输入:
2019-01-02 07:41:26.225000 5.49
2019-01-05 19:43:54.185000 5
2019-01-07 19:05:21.165000 5.18
2020-01-01 00:00:01.0 foobar
输出:
2019-01-02 07:41:26.225000 5.49 2019002 07:40:26.225000
2019-01-05 19:43:54.185000 5 2019005 19:42:54.185000
2019-01-07 19:05:21.165000 5.18 2019007 19:04:21.165000
2020-01-01 00:00:01.0 foobar 2019365 23:59:01.0
将 GNU awk 用于时间函数和 gensub():
$ cat tst.awk
BEGIN { OFS="\t" }
{
secs = mktime(gensub(/[-:]/," ","g"," "))
ms = gensub(/.*\./,"",1,)
print " ", , strftime("%Y%j",secs), strftime("%T.",secs-60) ms
}
$ awk -f tst.awk file
2019-01-02 07:41:26.225000 5.49 2019002 07:40:26.225000
2019-01-05 19:43:54.185000 5 2019005 19:42:54.185000
2019-01-07 19:05:21.165000 5.18 2019007 19:04:21.165000