Как сравнить два столбца из двух разных файлов?

У меня есть два файла, содержание которых:

Файл 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

Я хочу сравнить третий столбец в обоих файлах и, если они совпадают, в одной строке , печатает значение столбца 2 с определенными соответствующими значениями и «ок». В противном случае выведите значение столбца 2 и «error».

Моя первая попытка была:

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

Но это не работает.

2
задан 16 June 2020 в 23:55

3 ответа

The key here is "at the same line" - that suggests you need to index the array with the record number in the current file, FNR, rather than with the field value $3

Ex.

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

Alternatively, if you know how many columns there are in the first file (let's call it N), you could just paste them side by side and then just compare $3 with $(N+3)

Ex.

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

Note I omitted the -F"," because your files as posted are whitespace delimited not comma delimited - if they are actually CSV files, add it back.

4
ответ дан 19 June 2020 в 21:23

Использование Миллера для объединения двух таблиц:

$ mlr -p join -j 2 --lp a --rp b -f file1 then \
  put -q 'print $2.(($a3 == $b3) ? " ok" : " error")' < file2
0
ответ дан 19 June 2020 в 21:23

In my opinion, after a few years working with logs and source files is Comparing files using the User Interface in Visual Studio Code, for small files. It's easier to manipulate, create a report, etc.

Visual Studio Code

0
ответ дан 19 June 2020 в 21:23

Другие вопросы по тегам:

Похожие вопросы: