比较两个文件并写入不匹配的行以及不匹配的列

时间:2017-05-05 16:36:28

标签: linux shell

我有一个用例,我需要将两个文件与每个列进行比较,并在另一个文件中写下相应的差异以及显示不匹配列的一些标识。例如:

File 1

1|piyush|bangalore|dev
1|piyush|bangalore|QA
2|pankaj|bangalore|dev
3|rohit|delhi|QA

File 2

1|piyush|bangalore|QA
1|piyush|bangalore|QA
2|pankaj|bangalore|dev
3|rohit|bangalore|dev

输出文件看起来有点像。

File 1
1|piyush|bangalore|**dev**
File 2 
1|piyush|bangalore|**QA**
File 1
3|rohit|**delhi**|**QA**
File 2
3|rohit|**bangalore**|**dev**

我想要实现这样的目标,我也可以看到不匹配的列。 我试过了diff File1 File2 > Diff_File

但是这只给了我不匹配的记录或行。我也没有任何方法指出不匹配的列。如果可能的话,请帮我解决使用shell脚本的问题。提前谢谢。

2 个答案:

答案 0 :(得分:0)

以下内容应该让你进入球场:

paste -d"|" file1 file2 | awk -F"|" '{for(i=1;i<=(NF/2);++i){if($i!=$(i+(NF/2))){print "row "NR", column"i" mismatched"}}}'

我们正在使用paste将两个文件一行一行地连接在一起,并在粘贴的行之间粘贴一个管道。

然后我们把它传递给awk哪个

  1. 按管道分隔符-F"|"
  2. 拆分记录
  3. 为每条记录for(i=1;i<=(NF/2);++i)
  4. 循环浏览字段1-4
  5. 在该字段后面的字段4 (NF/2)测试该字段(来自第二个文件)if($i!=$(i+(NF/2)))
  6. 打印出发现不同的行和列{print "row "NR", column"i" mismatched"}
  7. 您可以添加到最后一位以包含不匹配的值:

    {print "row "NR", column"i" mismatched. Value1: "$i", Value2: "$(i+(NF/2))}
    

    或者你有什么。

答案 1 :(得分:0)

我不确定这是否是正确的做法。但截至目前我正在使用dwdiff linux实用程序来实现我的要求,即我得到不匹配的列。以下是可能对某人有用的输出。

DATA1

1|piyush|bangalore|dev 
1|piyush|bangalore|QA 
2|pankaj|bangalore|dev 
3|rohit|delhi|QA

DATA2

1|piyush|bangalore|QA 
1|piyush|bangalore|QA 
2|pankaj|bangalore|dev 
3|rohit|bangalore|dev

解决方案。

 $ dwdiff -d '|' data1 data2

<强>输出

1|piyush|bangalore|[-dev-]{+QA+} 
1|piyush|bangalore|QA 
2|pankaj|bangalore|dev 
3|rohit|[-delhi-]{+bangalore+}|[-QA-]{+dev+}