我有一个相当简单的shell脚本,它有一个相当基本的问题。我有多个文件遵循此约定:
TOTAL_summer_2003-06-01.nc
TOTAL_summer_2003-06-02.nc
TOTAL_summer_2003-06-03.nc
TOTAL_summer_2003-06-04.nc
TOTAL_summer_2003-07-01.nc
TOTAL_summer_2003-07-02.nc
TOTAL_summer_2003-07-03.nc
TOTAL_summer_2003-07-04.nc
TOTAL_summer_2003-08-01.nc
TOTAL_summer_2003-08-02.nc
TOTAL_summer_2003-08-03.nc
TOTAL_summer_2003-08-04.nc
希望结构清晰,有月有日的增加。现在我想用cdo
从第二天减去前一天。如果我把它放在单行中,它看起来像这样:
cdo sub TOTAL_summer_2003-06-02.nc TOTAL_summer_2003-06-01.nc RAIN_summer_2003-06-01.nc
cdo sub TOTAL_summer_2003-06-03.nc TOTAL_summer_2003-06-02.nc RAIN_summer_2003-06-02.nc
cdo sub TOTAL_summer_2003-06-04.nc TOTAL_summer_2003-06-03.nc RAIN_summer_2003-06-03.nc
我想模式很明显了。当然,这可以通过使用一个循环来完成,我这样尝试:
for i in `seq 6 8`
do
for j in 0{1,2,3,4}
do
cdo sub TOTAL_summer_2003-0${i}-${j+1}.nc TOTAL_summer_2003-0${i}-${j}.nc RAIN_summer_2003-0${i}-${j}.nc
done
done
但这不起作用,因为${j+1}
不做我想做的。我需要它比实际的j
值高一个。
如果将echo
命令而不是cdo sub
添加到脚本中,则返回以下内容:
TOTAL_summer_2003-06-1.nc TOTAL_summer_2003-06-01.nc RAIN_summer_2003-06-01.nc
TOTAL_summer_2003-06-1.nc TOTAL_summer_2003-06-02.nc RAIN_summer_2003-06-02.nc
TOTAL_summer_2003-06-1.nc TOTAL_summer_2003-06-03.nc RAIN_summer_2003-06-03.nc
TOTAL_summer_2003-06-1.nc TOTAL_summer_2003-06-04.nc RAIN_summer_2003-06-04.nc
TOTAL_summer_2003-07-1.nc TOTAL_summer_2003-07-01.nc RAIN_summer_2003-07-01.nc
TOTAL_summer_2003-07-1.nc TOTAL_summer_2003-07-02.nc RAIN_summer_2003-07-02.nc
TOTAL_summer_2003-07-1.nc TOTAL_summer_2003-07-03.nc RAIN_summer_2003-07-03.nc
TOTAL_summer_2003-07-1.nc TOTAL_summer_2003-07-04.nc RAIN_summer_2003-07-04.nc
TOTAL_summer_2003-08-1.nc TOTAL_summer_2003-08-01.nc RAIN_summer_2003-08-01.nc
TOTAL_summer_2003-08-1.nc TOTAL_summer_2003-08-02.nc RAIN_summer_2003-08-02.nc
TOTAL_summer_2003-08-1.nc TOTAL_summer_2003-08-03.nc RAIN_summer_2003-08-03.nc
TOTAL_summer_2003-08-1.nc TOTAL_summer_2003-08-04.nc RAIN_summer_2003-08-04.nc
所以它只是把一个常数1
放在那里而不是02, 03, 04 etc.
。
所以问题是,如何修改脚本,使它在每个循环中只添加+1
到j
?
3条答案
按热度按时间oknwwptz1#
使用双括号,例如:
$((j+1))
,尽管这将丢失前导0
;如果你知道日期总是1-4,那么你可以在文件名中硬编码0
(就像你现在对月份所做的那样)。假设条件:
10 / 11 / 12
,所以你需要一个不同的解决方案,不需要在月份前加上0
+1
天会导致下一个月的滚动(例如,5月31日+1天=> 6月1日);否则我们需要考虑一些额外的代码来处理“日期数学”与硬编码0不同,我可能会选择使用
printf
来为个位数的月/日前置一个前导0:**注意:**一旦对输出感到满意,请删除
echo
,让脚本执行cdo
调用这产生:
dz6r00yl2#
一个月的日子不会在第四天结束。事实上,6月1日至8月31日之间的每一天都被考虑在内。
您可以使用
date
命令来格式化日期。它还接受相对日期描述,如+ 1 day
。也就是说,您可以设置开始日期和结束日期变量,然后在循环中向开始日期添加一天,直到到达结束日期。或者,您可以在直接迭代文件时使用相同的技术。假设存在文件
TOTAL_summer_2003-06-01.nc
到TOTAL_summer_2003-08-30.nc
:ui7jx7zq3#
这有点过分,但您可以循环遍历文件路径并使用它们填充bash数组,使用日期(转换为纪元时间)作为“索引”。然后循环bash数组中定义的每个“epoch time”,并检查前一天的索引是否存在,在这种情况下,运行
cbo
命令:**备注:**这里我手动转换了日期,进行了一些计算,但你肯定可以使用
date
命令代替(=>不可移植且较慢)。示例输出: