我有两个文件,其内容如下:
文件 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 中的用户界面比较小文件会更容易操作、创建报告等。