【问题标题】:compare DDL with bash将 DDL 与 bash 进行比较
【发布时间】:2020-07-29 14:02:00
【问题描述】:

我需要为同一张表比较两个 ddl 并确定更改:

  • 新栏目
  • 已删除列
  • 数据类型更改

例如 DDL_1 是

column_1 int
column_2 char(10)
column_3 char(20)

DDL_2 是

column_1 int
column_3 char(40)
column_4 int

所以:

column_2 已删除
已添加 column_4
column_3 数据类型更改

我需要获取3个文件:deletedaddedchanged

如果我使用
comm -23 DDL_1 DDL_2 > deleted
我会得到 column_2(删除)但也会得到 column_3

comm -13 DDL_1 DDL_2 > added
我会得到 column_4(添加)但也会得到 column_3

我怎样才能得到正确的输出?
非常感谢
塞尔吉奥

【问题讨论】:

    标签: bash awk comm


    【解决方案1】:

    awk 来救援!

    $ awk 'FNR==1  {split(FILENAME,f,"_"); prefix=f[1]}
           NR==FNR {a[$1]=$2; next} 
           $1 in a {if(a[$1]!=$2) print > (prefix"_changed"); 
                    delete a[$1]; next} 
                   {print > (prefix_"added")} 
               END {for(k in a) print k,a[k] > (prefix_"deleted")}' prefix_file1 prefix_file2
    
    $ head added changed deleted
    ==> prefix_added <==
    column_4 int
    
    ==> prefix_changed <==
    column_3 char(40)
    
    ==> prefix_deleted <==
    column_2 char(10)
    

    【讨论】:

    • 酷!它工作得很好。现在我正在定义需要比较一个变量的文件名的第一部分,比如说 ${A},所以 awk 命令应该在 ${A}_file1 ${A}_file2 上运行。所以我希望输出文件,添加和删除的更改被称为 ${A}_changed、${A}_add 等,但是如果我在 print > "changed" 之后添加 ${A},例如,它不会工作:(我怎么能克服这个?
    • 如果我没有打错字,它应该从第一个文件名中读取前缀并在生成的文件名中使用它。
    • 不确定它是否有任何区别,但前缀已经是一个变量。我的意思是应该使用 ${prefix}_file1.txt 和 ${prefix}_file2.txt 运行 awk 命令。我不知道为什么 FNR==1 {split(FILENAME,f,"_"); prefix=f[1]} 没有阅读它:(基本上在你的 awk 命令之前我将前缀定义为 prefix=$(echo $A | cut -d'/' -f3)
    猜你喜欢
    • 2018-03-17
    • 2021-03-08
    • 1970-01-01
    • 2015-08-14
    • 2016-05-24
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多