如何比较两个不同文件中的两列?

如何比较两个不同文件中的两列?

我有两个文件,其内容如下:

文件 1:

ATOM      1  N   LEU     1     -10.186 -21.276  -0.497  1.00  2.00      PROT
ATOM      2  HT1 LEU     1     -10.773 -22.005  -0.843  1.00  4.00      PROT
ATOM      3  HT2 LEU     1      -9.316 -21.441  -0.958  1.00  4.00      PROT
ATOM      4  HT3 LEU     1     -10.007 -21.389   0.478  1.00  4.00      PROT
ATOM      5  CA  LEU     1     -10.642 -19.924  -0.729  1.00  3.00      PROT
ATOM      6  HA  LEU     1     -10.092 -19.286  -0.214  1.00  4.00      PROT
ATOM      7  CB  LEU     1     -10.604 -19.551  -2.214  1.00  3.00      PROT
ATOM      8  HB1 LEU     1     -11.432 -19.802  -2.731  1.00  4.00      PROT
ATOM      9  HB2 LEU     1      -9.764 -19.989  -2.566  1.00  4.00      PROT
ATOM     10  CG  LEU     1     -10.447 -17.969  -2.340  1.00  3.00      PROT

文件 2:

ATOM      1  N   LEU     1     -10.186 -21.276  -0.497  1.00  2.00      PROT
ATOM      2  HT1 LEU     1     -10.773 -22.005  -0.843  1.00  4.00      PROT
ATOM      3  HT2 LEU     1      -9.316 -21.441  -0.958  1.00  4.00      PROT
ATOM      4  HT3 LEU     1     -10.007 -21.389   0.478  1.00  4.00      PROT
ATOM      5  CA  LEU     1     -10.642 -19.924  -0.729  1.00  3.00      PROT
ATOM      6  HA  LEU     1     -10.092 -19.286  -0.214  1.00  4.00      PROT
ATOM      7  CB  LEU     1     -10.604 -19.551  -2.214  1.00  3.00      PROT
ATOM      8  HB1 LEU     1     -11.432 -19.802  -2.731  1.00  4.00      PROT
ATOM      9  HB2 LEU     1      -9.764 -19.989  -2.566  1.00  4.00      PROT
ATOM     10  CG1 LEU     1     -10.447 -17.969  -2.340  1.00  3.00      PROT

我想比较两个文件中的第三列,如果第三列相同,则在同一行打印该特定匹配值处的第二列的值和“ok”。否则打印第二列的值和“error”。

我第一次尝试的是:

awk -F"\," 'FILENAME=="file1"{A[$3]=$3} FILENAME=="file2"{if(A[$3]){print "$2 ok"}}' file1 file2

但是,它不起作用。

答案1

关键是“在同一条线上”- 这表明您需要使用当前文件中的记录号来索引数组,FNR而不是使用字段值$3

前任。

awk 'NR==FNR{a[FNR]=$3; next} {print $2, $3 == a[FNR] ? "ok" : "error"}' file1 file2

或者,如果你知道第一个文件中有多少列(我们称之为),你可以把它们并排粘贴,然后进行$3比较$(N+3)

前任。

paste file1 file2 | awk '{print $2, $14 == $3 ? "OK" : "error"}'

注意我省略了,-F","因为您发布的文件是用空格分隔的而不是用逗号分隔的 - 如果它们实际上是 CSV 文件,请将其添加回来。

答案2

使用磨坊主合并两个表:

$ mlr -p join -j 2 --lp a --rp b -f file1 then \
  put -q 'print $2.(($a3 == $b3) ? " ok" : " error")' < file2

答案3

我认为,经过几年的日志和源文件处理,使用 Visual Studio Code 中的用户界面比较小文件会更容易操作、创建报告等。

Visual Studio 代码

相关内容