【问题标题】:join columns across multiple lines in a Text based on common column using BASH使用 BASH 在基于公共列的文本中跨多行连接列
【发布时间】:2018-03-01 08:00:58
【问题描述】:

我有一个像下面这样的文件。

Table1|Column1
Table2|Column1
Table5|Column1
Table3|Column2
Table2|Column2
Table4|Column3
Table2|Column3
Table2|Column4
Table5|Column4
Table2|Column5 

如果 Column1 中的表名具有相同的属性,我将尝试从以下文件生成动态 SQL JOIn

select * from Table1 a inner join Table2 b on a.Column1=b.column1 inner join Table5 c on a.Column1=c.column1 

select * from Table3 a inner join Table2 b on a.column2 = b.column2 

..etc 直到文件结束

最好的方法是什么,请指教。

请注意,同一列可以出现在 2 个以上的表中(如最多 20 个表然后连接将重复 19 次)

【问题讨论】:

  • 应该如何加入Table2.Column5?似乎连接是通过列名完成的,从这个描述中连接表似乎很奇怪,请注意,取决于 dbms select * 可能由于列名重复而失败,建议选择具有表别名的特定列,使用旧语法怎么样select .. from table1, ..table5 where table1.column1 = table2.column1 ...
  • 关于 Table2.Column5 如果存在另一个 TableN 和 column5 则加入 else 忽略它。基本上,这些表都是来自特定数据模型域的相关转储,作为测试的一部分,我试图查看至少部分外键,主键连接测试是否可以自动化。我可以使用任何连接语法,只要它有效。如果有人可以帮助弹出至少具有相同列的表名,我可以尝试使用连接并生成其余的连接语法。@NahuelFouilleul

标签: bash parsing text dynamic-sql


【解决方案1】:

这不是一个完整的答案。但是,我认为您应该能够使用此答案作为垫脚石来解决问题。

我们使用 GNU awk 进行解析。为了提高可读性,我们使用脚本文件parse.awk 而不是一个长命令。

# parse.awk
{ a[$2][$1] };
END {
    for (col in a) {
        printf "%s", col;
        for (tab in a[col])
            printf "|%s", tab;
        print ""
    }
}

当我们调用脚本时...

awk -F\| -f parse.awk yourFile

...在您的示例中,输出为

Column1|Table5|Table1|Table2
Column2|Table2|Table3
Column3|Table2|Table4
Column4|Table5|Table2
Column5|Table2

从那里您应该能够构建您的 SQL 命令。您甚至可以调整parse.awk 直接生成SQL 命令。

【讨论】:

  • 谢谢,这可能会有所帮助。请您确认上面粘贴的脚本是否完整。我收到一些语法错误,如下 awk: parse.awk:2: { a[$2][$1] }; awk: parse.awk:2: ^ 语法错误 awk: parse.awk:6​​: for (tab in a[col]) awk: parse.awk:6​​: ^ 语法错误@socowi
  • @NaveenVenugopal 该脚本适用于我。你的awk --version 是什么?我的是 GNU Awk 4.1.3,API:1.1(GNU MPFR 3.1.4,GNU MP 6.1.0)
  • awk --version GNU awk 3.1.8
  • 我可以用那个版本重现错误,但不能轻易修复。 awk 的那个版本似乎不支持多维数组。你有机会更新你的awk吗?版本 3.1.8 来自 2010 年。
  • 感谢@Socowi 提供额外的篇幅。不幸的是,这是我需要运行脚本的服务器,我无法控制它。此时我不知道如何用我的 awk 版本改进代码。可能其他人可能有更好的想法。
猜你喜欢
  • 2017-02-10
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多