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
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用awk合并两个文件的列可以使用以下命令: ``` awk 'FNR==NR{a[FNR]=$0;next}{print a[FNR],$0}' file1 file2 ``` 这个命令的作用是在每一行输出file1中的对应行和file2中的对应行。其中,FNR表示当前处理的行号,NR表示处理的总行数。当处理第一个文件file1时,使用a[FNR]=$0将每一行保存到数组a中。在处理第二个文件file2时,输出数组a中对应的行和当前行的内容,从而实现列的合并。 ### 回答2: awk是一种文本处理工具,它的功能非常强大。可以用它合并两个文件的列。 如果我们有两个文件file1和file2,每个文件各有多行,每行有若干列。我们想要合并这两个文件的某些列,可以使用awk命令。 假设file1中的第一列是A列,第二列是B列,而file2中的第一列是C列,第二列是D列。我们想要按照A列来合并这两个文件的对应行。 可以使用以下命令来实现: awk 'NR==FNR{a[$1]=$2;next}{print $0,a[$1]}' file2 file1 > output 在这个命令中,我们首先使用NR==FNR来判断是否是第一个文件,如果是的话,将file2的第一列作为数组a的索引,第二列作为值。然后使用next来跳过接下来的命令。 接着,对于file1中的每一行,我们打印$0(表示整行内容),和数组a中对应索引的值。这样就完成了两个文件的列的合并。 最后把结果输出到output文件中。 这样,我们就用awk合并了两个文件的列。当然,这只是一个简单的例子,awk还有很多其他功能和用法,可以根据实际需求来进行灵活的处理。 ### 回答3: 在awk中,我们可以使用多种方式合并两个文件的列。这里我将介绍两种常见的方法: 方法一:使用NR和FNR变量进行合并 我们可以使用NR和FNR这两个内置变量来实现文件列的合并。NR表示当前正在处理的记录编号,而FNR表示当前文件中的记录编号。当awk开始处理第二个文件时,FNR重新从1开始计数。因此,我们可以利用这一特性来判断当前处理的是第一个文件还是第二个文件。下面是一个示例代码: ```awk awk '{printf "%s ", $0} FNR==NR {a[FNR]=$0; next} {print a[FNR]}' file1.txt file2.txt ``` 这个命令会将file1.txt和file2.txt的每一行合并到一行中,两个文件的列用空格分隔。注意,file1.txt应该在file2.txt之前出现。 方法二:使用paste命令 除了使用awk,我们还可以使用paste命令来合并两个文件的列。paste命令可以将多个文件的对应行合并到一行中,并且可以选择使用不同的分隔符。下面是一个示例代码: ```shell paste -d' ' file1.txt file2.txt ``` 这个命令会将file1.txt和file2.txt的每一行合并到一行中,两个文件的列用空格分隔。可以根据需要选择不同的分隔符。 无论使用awk还是paste命令,我们都可以根据具体的需求来调整代码。希望这些方法能帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值