linux - 如何修改/子集 wget 脚本以指定日期范围以仅将某些年份下载到不同的脚本中?

标签 linux bash date download wget

我正在尝试从 CMIP6 网站 ( https://esgf-node.llnl.gov/search/cmip6/ ) 下载大量数据用于某些研究,该网站为每个模型提供了 wget 脚本。

从 1850 年到 2014 年,这些脚本每 6 小时或每月一次。日期格式如下所示(第一个脚本):185001010600-185101010000 或(第二个脚本)195001010600-195002010000, 1950 02010600-195003010000

<小时/>

我的目标是将一个巨大的剧本变成几个较小的剧本,每个剧本的时间为 1980 年至 2015 年的五年

举个例子,我想将主脚本子集为间隔 5 年的不同脚本(“19800101-19841231”然后“19850101-19901231”等),每个脚本分别命名为 wget-1980_1985.sh、wget-1985_1990.sh

对于第二个脚本的示例日期范围,我需要: 197912010600 到 198601010000,然后每 5 年

<小时/>

我是初学者,如果可以的话请帮忙!

每个文件的部分 wget 脚本格式如下所示(它不会让我复制并粘贴整个内容,因为链接太多[请参阅下面自行查找文件]):

1.) #These are the embedded files to be downloaded download_files="$(cat <185001010600-185101010000.nc' 'http://esgf-data2.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/CMIP/MIROC/MIROC6/historical/r1i1p1f1/6hrPlevPt/hus/gn/v20191204/hus_6hrPlevPt_MIROC6_historical_r1i1p1f1_gn_185001010600-185101010000.nc' 'SHA256' 'fa9ac4149cc700876cb10c4e681173bcc0040ea03b9a439d1c66ef47b0253c5a' 'hus_6hrPlevPt_MIROC6_historical_r1i1p1f1_gn_185101010600-185201010000.nc' 'http://esgf-data2.diasjp.net/thredds/fileServer/esg_dataroot/CMIP6/CMIP/MIROC/MIROC6/historical/r1i1p1f1/6hrPlevPt/hus/gn/v20191204/hus_6hrPlevPt_MIROC6_historical_r1i1p1f1_gn_185101010600-185201010000.nc' 'SHA256' '4ef4f99aa34aae6dfdafaa4aab206344125abe7808df675d688890825db53047'

2.) For the second script, the dates look like this: 'ps_6hrLev_MIROC6_historical_r1i1p1f1_gn_195001010600-195002010000.nc'

要运行它,您只需从网站下载脚本(见下文)

<小时/>

或者从此链接下载应该可以: 1.) https://esgf-node.llnl.gov/esg-search/wget/?distrib=false&dataset_id=CMIP6.CMIP.MIROC.MIROC6.historical.r1i1p1f1.6hrPlevPt.hus.gn.v20191204|esgf-data2.diasjp.net

2.) 可以在这里看到类似的脚本(日期不同,但我也需要这个): https://esgf-node.llnl.gov/esg-search/wget/?distrib=false&dataset_id=CMIP6.CMIP.MIROC.MIROC6.historical.r1i1p1f1.6hrLev.ps.gn.v20191114|esgf-data2.diasjp.net

<小时/>

要在终端中运行脚本,这是我使用的命令

bash wget* -H

它将下载每个文件。

我可以 vi 脚本并删除每个我不需要的文件(通过使用“dd”),但这将非常耗时。

<小时/>

要查找此数据并从网站获取 wget 脚本,请访问:https://esgf-node.llnl.gov/search/cmip6/

并选择页面左侧的变量,如下所示: 来源 ID:MIROC6, 实验ID:历史, 变体标签:r1i1p1f1, 表 ID:6hrPlevPt, 和变量: hus it will look like this

*如果这些文件太大,您还可以选择“频率:每月”来代替较小的文件。我只是想让你看看日期格式,因为每月只是月份和年份

然后点击搜索,它会给你一个可供下载的模型。 it will look like this在底部的链接上,会显示“wget script”。单击该按钮即可下载。

你可以

vi wget*

查看和/或编辑它或

bash wget* -H

运行/下载每个文件。 它可能会要求您登录,但我发现输入无意义的用户名和密码仍然会开始下载。

<小时/>

请帮忙!这将是我生命中接下来的 6 个月,我真的不想“dd”所有这些我不需要的文件!

最佳答案

bash for 循环可以生成相关的日期范围和输出文件名。

一个简单的 sed 脚本可以删除按顺序出现的相关行。

例如:

#!/bin/bash

in=esgf_script

for y in $(seq 1979 5 2014); do
    out="wget_{$y}-$((y+4)).sh"
    sed '/_gn_/{               # if some kind of url:
        /_gn_'$((y+5))'/,$  d; #   delete if year >= y+5
        /_gn_2015/,$        d; #   delete if year >= 2015
        /_gn_'$y'/,$       !d; #   delete if year < y
    }' <"$in" >"$out"
done

从 1979 年到 2014 年,seq 命令每五年生成一次。

sed 脚本:

  • 查找包含网址的行:/_gn_/
  • 如果年份太大则删除
  • 否则,如果年份足够大,则不会删除

此代码假设:

  • 除网址外,没有任何行包含第一个正则表达式 (/_gn_/)
  • 网址按年份升序显示(例如,包含 1994 年的网址不能出现在包含 1993 年的网址之前)

关于linux - 如何修改/子集 wget 脚本以指定日期范围以仅将某些年份下载到不同的脚本中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60232183/

相关文章:

linux - ptpd2 无法在对等主从连接上工作

python - 从多个文件中搜索和排序数据

java - 如何加速 FileOutputStream 和 FileOutputStream close()?

linux - 寻找一种监视文件、运行脚本和刷新浏览器的简单方法

linux - 过去 X 小时的 Grep

javascript - 如何获取HH :MM:SS difference using milliseconds in javascript?

php - 如何获取从今天开始的记录?

postgresql - 带时区的 Postgres 查询

linux - 如何在 sed 中指定非捕获组?

linux - 如何采用成对的线并连接起来?