awk比较两个文件

在运维过程中经常要比较两个文件的相同行或者不同行。

下面两个方法亲测有效,但是文件较大时会耗时较长,或者内存溢出。

示例文件:


[xxx@xxx test]$ cat 1
1|2
3|4

[xxx@xxx test]$ cat 2
1|2
4|5

按行比较

1.同时在file1和file2中的行

awk  '{if(ARGIND==1) {val[$0]}else{if($0 in val) print $0}}' file1 file2

逻辑:当文件1时,将文件1按行写入数组;当文件2时,按行判断文件2是否在数组中,如果在,打印该行。

[xxx@xxx test]$ awk '{if(ARGIND==1) {val[$0]}else{if($0 in val) print $0}}' 1 2
1|2

2.只在file1中有的行.

awk  '{if(ARGIND==1) {val[$0]}else{if($0 in val)  delete val[$0]}}END{for(i in val) print i}' file1 file2

逻辑:当文件1时,将文件1按行写入数组;当文件2时,按行判断文件2是否在数组中,如果在,删除数组中该条记录;打印数组中的值。

[xxx@xxx test]$ awk '{if(ARGIND==1) {val[$0]}else{if($0 in val)  delete val[$0]}}END{for(i in val) print i}' 1 2

3|4
[xxx@xxx test]$ awk '{if(ARGIND==1) {val[$0]}else{if($0 in val)  delete val[$0]}}END{for(i in val) print i}' 2 1
4|5

按某列比较

1.比较file1 和file2 第一列,输出file2中第一列与file1相同的行

awk -F '|' '{if(ARGIND==1) {val[$1]}else{if($1 in val)  print $0}}' file1 file2

逻辑:当文件1时,将文件1的第一列写入数组;当文件2时,按行判断文件2中第一列的值是否在数组中,如果在,打印该行。

[xxx@xxx test]$ awk -F '|' '{if(ARGIND==1) {val[$1]}else{if($1 in val)  print $0}}' 1 2
1|2

2.比较file1 和file2 第一列,输出file2中第一列与file1不同的行

awk -F '|' '{if(ARGIND==1) {val[$1]}else{if($1 in val)  {delete val[$1]} else {print $0}}}' file1 file2

逻辑:当文件1时,将文件1的第一列写入数组;当文件2时,按行判断文件2中第一列的值是否在数组中,如果不在,打印该行。

[xxx@xxx test]$ awk -F '|' '{if(ARGIND==1) {val[$1]}else{if($1 in val)  {delete val[$1]} else {print $0}}}' 2 1
3|4

[xxx@xxx test]$ awk -F '|' '{if(ARGIND==1) {val[$1]}else{if($1 in val)  {delete val[$1]} else {print $0}}}' 1 2
4|5

你可能感兴趣的:(awk,shell,awk)