У меня есть два файла, содержание которых:
Файл 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
Но это не работает.
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.
Использование Миллера для объединения двух таблиц:
$ mlr -p join -j 2 --lp a --rp b -f file1 then \
put -q 'print $2.(($a3 == $b3) ? " ok" : " error")' < file2
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.