【问题标题】:Nested for loop for months within a year一年内嵌套几个月的for循环
【发布时间】:2018-09-25 05:08:57
【问题描述】:

我目前正在编写一个 shell 脚本,它将查询一些配置单元表的每月记录计数以获取表列表,然后将总计数值提取为 .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

【问题讨论】:

  • Plenty of examples 网络上的嵌套循环,所以想知道你可能会卡在哪里。你能展示一下你到目前为止所做的尝试吗?
  • 好的,刚刚用一些示例代码编辑了帖子
  • 您几乎可以在 do..done 块内插入另一个 for 循环,并以数字或字符串的形式迭代数月。

标签: linux bash shell for-loop


【解决方案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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

    • 感谢@sal 最终修改了嵌套循环,但遵循相同的解决方案。
    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2020-07-19
    • 2020-09-17
    • 2015-10-15
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多