У меня есть два файла, которые похожи на это:
file1 (уникальные идентификаторы):
C84610112
C96209347
C84774620
C84774691
C85594749
C89372772
C89651687
C89845500
C89914896
C91269765
C91526663
C92210411
C92254517
C93709504
C94303303
C95100561
C95100609
C95417520
C95696352
C96045246
C96045496
C96060727
C96076986
и file2:
1 C95696352 score: -69.785 nathvy = 38 nconfs = 888
2 C98230482 score: -57.431 nathvy = 47 nconfs = 575
3 C96209347 score: -57.128 nathvy = 24 nconfs = 1188
4 C36510773 score: -56.502 nathvy = 38 nconfs = 7595
5 C04355288 score: -56.400 nathvy = 41 nconfs = 50502
6 C89372772 score: -55.728 nathvy = 22 nconfs = 3228
7 C96209347 score: -54.713 nathvy = 24 nconfs = 162
8 C96209347 score: -53.901 nathvy = 24 nconfs = 159
9 C06169346 score: -53.438 nathvy = 22 nconfs = 105
10 C95696352 score: -52.848 nathvy = 38 nconfs = 878
11 C98216318 score: -52.061 nathvy = 52 nconfs = 1092
12 C04285713 score: -52.009 nathvy = 38 nconfs = 1355
13 C96209347 score: -51.477 nathvy = 24 nconfs = 1375
14 C98222837 score: -50.730 nathvy = 34 nconfs = 588
15 C98216318 score: -50.694 nathvy = 52 nconfs = 1136
16 C32832068 score: -50.546 nathvy = 22 nconfs = 548
17 C95696352 score: -50.475 nathvy = 38 nconfs = 3220
18 C32832068 score: -50.457 nathvy = 22 nconfs = 16235
19 C95696352 score: -50.234 nathvy = 38 nconfs = 3048
20 C85594749 score: -49.780 nathvy = 44 nconfs = 4536
21 C72332782 score: -49.676 nathvy = 41 nconfs = 3942
22 C97970648 score: -49.616 nathvy = 45 nconfs = 17640
23 C04285713 score: -49.594 nathvy = 38 nconfs = 14038
24 C98043133 score: -49.370 nathvy = 43 nconfs = 1236
25 C89372772 score: -49.308 nathvy = 22 nconfs = 471
26 C97970648 score: -49.297 nathvy = 45 nconfs = 17850
27 C85594749 score: -49.122 nathvy = 44 nconfs = 4158
28 C70006381 score: -49.092 nathvy = 24 nconfs = 880
Я хотел бы соответствовать идентификаторам от file1
с идентификаторами в file2
(второй столбец) и для тех, которые соответствуют для печати их. Кроме того, в file2
некоторые идентификаторы повторяются, такой как C96209347
(хотя целые строки не идентичны). Я хотел бы к grep те строки, которые появляются впервые только и другие для пропуска. Таким образом в этом определенном примере с C96209347
только третья строка от file2
должен быть распечатан. Кто-либо может помочь?
Попробуйте это,
grep -f file1 file2 | awk '!_[$2]++'
1 C95696352 score: -69.785 nathvy = 38 nconfs = 888
3 C96209347 score: -57.128 nathvy = 24 nconfs = 1188
6 C89372772 score: -55.728 nathvy = 22 nconfs = 3228
20 C85594749 score: -49.780 nathvy = 44 nconfs = 4536
Объяснение
grep -f file1 file2
: поиск в file2 для соответствий шаблонов получен из file1awk '!_[$2]++'
: Ничего не печатайте если поле $2
был замечен прежде (через) _
имя массива (может быть что-либо, например, "замеченный"),_[$2]++
создаст запись массива с ключом, являющимся содержанием поля $2
и добавьте 1_[$2]
не был (!
) уже набор, распечатайте строку. print
команда является действием по умолчанию, которое сделано awk, когда условие соответствует.С одним только awk:
$ awk 'NR==FNR {a[$1]=1; next} $2 in a {print; delete a[$2]}' file1 file2
1 C95696352 score: -69.785 nathvy = 38 nconfs = 888
3 C96209347 score: -57.128 nathvy = 24 nconfs = 1188
6 C89372772 score: -55.728 nathvy = 22 nconfs = 3228
20 C85594749 score: -49.780 nathvy = 44 nconfs = 4536