аномалия grep в фильтрации .csv - PullRequest
0 голосов
/ 20 марта 2019

При попытке отфильтровать строки из CSV-файла у меня возникло странное событие:

У меня есть два .csvs, один из которых содержит большое количество данных, другой содержит идентификаторы (имя в первом столбце основного .csv) строк, которые необходимо удалить из первого файла.

Основной файл выглядит так:

scaffold_1234_ref00001_1234,0,1,NA,0.8... 
scaffold_1235_ref00002_12345,1,0.3,NA,1...

Второй выглядит так:

scaffold_1234_ref0001_1234
scaffold_1234_ref_002_1234

Я использовал grep -v -f filter.csv data_to_filter.csv > filtered.csv, который, похоже, создает выходной файл, в котором отсутствуют необходимые строки, однако в выходном файле их больше, чем ожидалось.

Исходные данные содержат 1 142 936 строк, я пытаюсь удалить 122 788, но 123 036 удаляются в выходном файле (248 - слишком много!).

Я проверил наличие дубликатов в основных данных, используя awk -F, 'a[$1]++{print $1}' data_to_filter.csv, но это не выявило дублирования.

Есть идеи? Я вроде как новичок в этом!

1 Ответ

0 голосов
/ 21 марта 2019

С помощью команды grep grep -v -f filter.csv data_to_filter.csv вы выполняете частичное совпадение регулярных выражений для каждой строки данных, поэтому:

scaffold_1234_ref0001_1234

будет соответствовать

scaffold_1234_ref0001_1234567
fooscaffold_1234_ref0001_1234

и многим другим значениямв первом поле И это будет соответствовать аналогичным строкам где-либо еще в каждой строке.Он также будет использовать любые метасимволы RE как таковые, поэтому . будет означать any character и т. Д. Любой из них или оба могут объяснить, почему он удаляет больше строк, чем ожидалось.Вместо этого выполните точное совпадение строки с полным текстом определенного целевого поля:

awk -F, 'NR==FNR{filter[$0];next} !($1 in filter)' filter.csv data_to_filter.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...