比较两个文件的两个字段并打印不匹配的情况

1 投票
2 回答
743 浏览
提问于 2025-04-18 12:22

我有两个文件。
如果文件1的第一列和文件2的第一列不匹配,就把文件1的整行内容打印到输出文件里。
如果两个文件的第一列匹配,并且文件1的第二列的值,比如说"N",大于"N+10"或者小于"N-10"时,才会把文件1的整行内容打印出来。

文件1:

C1  23
C1  24
C2  66
C3  88
C6  100 
C7  79
C20 200

文件2:

C1  44
C1  35
C2  70 
C4  88
C6  92
C7  90
C9  80

预期输出:

C1  23
C1  24
C3  88
C7  79
C20 200

我希望能得到你的帮助来解决这个问题。
谢谢你。

2 个回答

0

因为你只有两列数据,我建议你使用 paste 命令来把它们合并,这样会让 awk 的处理逻辑简单很多:

paste file1 file2 | awk '{ if($1 != $3){print $1,$2}else if($4 > ($2 + 10) || $4 < ($2 -10 )){print $1,$2} }'
C1 23
C1 24
C3 88
C7 79
C20 200
1

使用 awk 可以做到以下几点:

awk '
NR==FNR { 
    lines[NR,"col1"] = $1
    lines[NR,"col2"] = $2
    lines[NR,"line"] = $0
    next
}
(lines[FNR,"col1"] != $1) {
        print lines[FNR,"line"]
        next
}
(lines[FNR,"col2"]+10 < $2 || lines[FNR,"col2"]-10 > $2) {
        print lines[FNR,"line"]
}' file1 file2
C1  23
C1  24
C3  88
C7  79
C20 200
  • 我们读取第一个文件,并创建一个多维数组,使用行号和字段作为键,把第一列、第二列和行内容适当地存储起来。
  • 当我们处理第二个文件时,保持检查条件,如果符合条件就打印出这一行。

撰写回答