Сравнение двух файлов на основе 1-го столбца, печать уникальной части одного файла - PullRequest
0 голосов
/ 26 апреля 2018

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

file1:

RYR2 29 70  0.376583106063  4.77084855376
MUC16 51 94 0.481067457376  3.9233164551
DCAF4L2 0 13    0.0691414496833 3.05307268261
USH2A 32 62 0.481792717087  2.81864194236
ZFHX4 14 37 0.371576262084  2.81030548752

file2:

A26B2
RYR2
MUC16
ACTL9

Мне нужно сравнить их на основе первого столбца и вывести только те строки первого файла, которые не во втором, поэтому вывод должен быть:

DCAF4L2 0 13    0.0691414496833 3.05307268261
USH2A 32 62 0.481792717087  2.81864194236
ZFHX4 14 37 0.371576262084  2.81030548752

Я пытался с grep:

 grep -vFxf file2 file1

с awk:

awk 'NR==FNR {exclude[$0];next} !($0 in exclude)' file 2 file1

Прдч:

comm -23 <(sort file1) <(sort file2)

ничего не работает

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете использовать

grep -vFf file2 file1

Кроме того, grep -vf file2 file1 также будет работать, но в случае, если строки file2 содержат * или [, которые должны быть прочитаны как буквенные символы, вы можете столкнуться с проблемами, поскольку их следует экранировать. F заставляет grep рассматривать эти строки как фиксированные.

ПРИМЕЧАНИЯ

  • -v: инвертировать совпадение.
  • -f file: взять регулярные выражения из файла.
  • -F: интерпретировать шаблон как список фиксированных строк (вместо регулярных выражений), разделенных символами новой строки, любой из которых должен соответствовать.

Таким образом, он считывает регулярные выражения из file2 и применяет их к file1, и как только находит совпадение, эта строка не выводится из-за инвертированного поиска. Этого достаточно, потому что только первый столбец содержит буквенно-цифровые символы, остальные содержат только числовые данные.

Почему ваша команда не сработала

Опция -x (сокращение от --line-regexp) означает Select only those matches that exactly match the whole line.

Также, см. Больше о grep опциях в grep документации .

...