我正在尝试创建一个bash函数,一旦用户输入项目代码,就会将csv文件打印到屏幕上。
例如,当商品代码为526时,我希望发生以下情况。
wget -O stats.zip "http://data.un.org/Handlers/DownloadHandler.ashx?DataFilter=itemCode:526&DataMartId=FAO&Format=csv&c=2,3,4,5,6,7&s=countryName:asc,elementCode:asc,year:desc"
zcat stats.zip
有没有办法将所有这些封装成一个通用函数?如何使用bash脚本进行此操作?例如,如果我传入值XYZ,我希望我的脚本执行
wget -O stats.zip "http://data.un.org/Handlers/DownloadHandler.ashx?DataFilter=itemCode:XYZ&DataMartId=FAO&Format=csv&c=2,3,4,5,6,7&s=countryName:asc,elementCode:asc,year:desc"
zcat stats.zip
答案 0 :(得分:0)
function dl {
wget -O stats.zip "http://...?DataFilter=itemCode:$1";
unzip -c stats.zip | columns -s, -t;
}
此外,我已使用column
命令format the CSV output。
您可以使用ItemCode作为参数调用该函数:dl 526
答案 1 :(得分:0)
乍一看,使用unzip --help
时,我看不到unzip
的选项会对此有所帮助(但我看到的是旧版本,UnZip 5.52 of 28 February 2005, by Info-ZIP
随附Mac OS X 10.10.5)。 -M
选项管道通过more
,但这只是提取文件名列表,而不是文件内容。因此,如果这是整个故事,您需要解压缩以提取文件,然后cat
提取的文件,然后删除提取的文件,可能还有zip文件。
是的,你可以编写一个脚本(甚至是一个函数 - 虽然我已经过时了,但是脚本更合适)才能做到这一点。
OTOH,如果你转到Info-Zip主页,你会发现当前版本是2009年发布的Unzip 6.0,documentation表示它支持-c
选项
将文件解压缩到stdout / screen(''CRT'')。此选项类似于
-p
选项,除了每个文件的名称在提取时打印,允许-a
选项,并且如果合适,将自动执行ASCII-EBCDIC转换。解压缩用法屏幕中未列出此选项。
这与其他压缩器和解压缩器命令一致,例如gzip
,bzip2
,xz
等。因此,旧版本中可能有-c
选项,快速实验显示版本为5.52。
所以,如果你有一个最新版本的unzip
(对于一个错误定义的'最近足够'的值),你可以使用:
unzip -c stats.zip
将stats.zip
的内容发送到标准输出。
我怎么写这个呢?
与任何其他脚本相同:编写要在脚本中执行的命令。如果要将项代码作为参数提供,则可以编写代码以要求一个或多个参数并将其传递给程序。 shell脚本的一个好处是,shell脚本的基础知识正是您在终端上键入的相同作业。例如,这与C程序形成对比。
例如:
trap "rm -f stats.zip; exit 1" 0 1 2 3 13 15
for item in "$@"
do
wget -O stats.zip "http://data.un.org/Handlers/DownloadHandler.ashx?DataFilter=itemCode:$item&DataMartId=FAO&Format=csv&c=2,3,4,5,6,7&s=countryName:asc,elementCode:asc,year:desc"
zcat -c stats.zip
done
rm -f stats.zip
trap 0
如果没有参数,这没有任何作用。对于给出的每个参数,它从网站获取信息,将文件内容解压缩到标准输出,然后返回下一个项目。最后,它会删除stats.zip
文件。它具有保护功能,以便在中断时删除文件。最后的trap 0
取消退出陷阱,因此脚本可以成功退出。
您可能应该将中间文件转换为更好(唯一)的名称,可能使用mktemp
命令:
tmp=$(mktemp "${TMPDIR:-/tmp}/items.XXXXXX")
然后使用代码使用$tmp
的{{1}}。