【问题标题】:Compare two txt files with awk, both have 4 columns present in it用 awk 比较两个文本文件,两者都有 4 列
【发布时间】:2016-08-23 11:33:11
【问题描述】:

我有两个 txt 文件,比如说 file1 和 file2 有 4 列..... 表名、列名、数据类型、长度

文件 1 包含

Emp name varchar 30
Emp ID   int 20
Emp age  int 3
Emp no   int 10

文件2包含

Emp name varchar 30
Emp ID   varchar 20
Emp age  int 5
Emp DOB. Date 10

我想根据第1列和第2列(表名,列名)比较file1和file2

基于这2列比较数据类型和长度列是否有任何不匹配

如果数据类型或长度不匹配 显示相应的行,例如(来自两个文件的数据,同一行)

Emp age  int 3 Emp age  int 5

像这样输出文件 1 中的唯一行

Emp emailid varchar 50

作为另一个命令的输出

当我使用 comm 命令获取文件 1 的唯一记录时 它给出的输出类似于

Emp ID   int 20
Emp age  int 3
Emp no   int 10

但希望o/p只有

Emp no int 10

因为列(表名、列名)也存在于文件 2 中。

【问题讨论】:

  • 请为您当前的 file1 和 file2 输入文件添加所需的输出。
  • 以及到目前为止您尝试过的任何代码。

标签: linux shell awk sh ksh


【解决方案1】:

根据你的详细描述,我想出了这个单行:

awk '{k=$1FS$2}NR==FNR{a[k]=$3FS$4;next}
   k in a{if($3FS$4!=a[k])print $0,k,a[k];next}7' file2 file1

使用您给定的输入文件:

kent$  head f1 f2
==> f1 <==
Emp name varchar 30
Emp ID   int 20
Emp age  int 3
Emp no   int 10

==> f2 <==
Emp name varchar 30
Emp ID   varchar 20
Emp age  int 5
Emp DOB. Date 10

kent$  awk '{k=$1FS$2}NR==FNR{a[k]=$3FS$4;next}k in a{if($3FS$4!=a[k])print $0,k,a[k];next}7' f2 f1
Emp ID   int 20 Emp ID varchar 20
Emp age  int 3 Emp age int 5
Emp no   int 10

注意全部区分大小写。例如。 id 和 ID 是不同的。

【讨论】:

  • 嗨肯特....感谢您的快速回复。一个小的变化我不想在这个查询的输出中出现 Emp no int 10 行....我希望这个结果在另一个查询中(在 file1 中是唯一的)
  • @cvinay24 很简单,去掉最后的7
  • 肯特,awk 命令没有显示文件 2 的内容......o/p 执行命令时:emp ID int 20......desired o/p : emp ID int 20 emp ID varchar 20
  • @cvinay24 我不知道你现在想要输出什么......在你的问题下查看我的评论......
猜你喜欢
  • 1970-01-01
  • 2018-03-04
  • 2015-02-22
  • 1970-01-01
  • 2017-01-31
  • 2017-07-25
  • 2012-09-05
  • 1970-01-01
相关资源
最近更新 更多