创建一个bash函数来将csv打印到屏幕上

时间:2015-09-11 02:23:54

标签: bash csv

我正在尝试创建一个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

2 个答案:

答案 0 :(得分:0)

function dl {
 wget -O stats.zip "http://...?DataFilter=itemCode:$1"; 
 unzip -c stats.zip | columns -s, -t; 
}
  1. 您可以使用解压缩" -c"命令print the content of files
  2. Bash(和其他shell)允许您将语句包装到functions
  3. 此外,我已使用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转换。解压缩用法屏幕中未列出此选项。

这与其他压缩器和解压缩器命令一致,例如gzipbzip2xz等。因此,旧版本中可能有-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}}。