一年内嵌套几个月,

时间:2018-09-25 05:08:57

标签: linux bash shell for-loop

我当前正在编写一个外壳脚本,该脚本将查询一些配置单元表以获取表列表的每月记录计数,然后将总计数值提取为.txt文件。我目前有每年查询所有表的代码,但是如何最好每年也每月一次循环呢?

例如,现在我的脚本将遍历我所经过的每一年(year = 2001、2002、2003 ...),并查询表并提取文件。我希望每年循环一次,这样理想情况下每年将有12个文件,并且无论我分配多少年都继续循环。

以下我目前拥有的示例伪代码:

#!/usr/bin/sh    
years=2001,2002,2003,2004

for year in $(echo ${years} | sed "s/,/ /g")
do 
    select_sql="INSERT OVERWRITE LOCAL DIRECTORY <path> ROW FORMAT DELIMITED FIELDS TERMINATED BY '~' select * from tbl where year(date)=$year"
    beeline -u "<jdbc connection>" --hiveconf -e "$select_sql"

done

2 个答案:

答案 0 :(得分:1)

这个问题带有一个bash标签,但是解释器是/usr/bin/sh

无论如何,让我们使用bash

#!/bin/bash

for clause in "year(date)="{2001,2002,2003,2004}" and month(data)='"{Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec}"'"
do
    select_sql="INSERT OVERWRITE LOCAL DIRECTORY <path> ROW FORMAT DELIMITED FIELDS TERMINATED BY '~' select * from tbl where $clause"
    echo "$select_sql"
    #beeline -u "<jdbc connection>" --hiveconf -e "$select_sql"
done

答案 1 :(得分:0)

在这种情况下,嵌套循环和数组可能类似于:

years=2001,2002,2003,2004
months=(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)

for year in $(echo ${years} | sed "s/,/ /g")
do
    for month in "${months[@]}"
    do
        # do the query and file saving here
        echo "$year $month"
    done
done