Удаление строк, которые не содержат строк из файла CSV, с помощью однострочного reg exp grep / sed - PullRequest
1 голос
/ 04 декабря 2010

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

Пример idsfile.csv:

000001,000002,000005,000007,000008,000009,000011,000021,000029,000040,...

Пример datafile.txt:

titl e1   000001   description1 
title2   000003   descr iption2 
ti tle3   000021   des cripti on3 
title4   000023   description4 

Если бы я делал это, не считывая идентификаторы из файла, я бы попытался:

grep -Ev '/\t000001\t|\t000002\t|\t000003\t/' datafile.txt > output.txt

но я не уверен, как читать значения через запятую так, чтобы я мог затем использовать их в регулярном выражении.

Кто-нибудь знает, как я могу собрать это как однострочный командный запрос, пожалуйста? Возможно с текстами можно?

Редактировать: На самом деле, если бы я изменил idsfile.csv, чтобы иметь идентификатор в каждой строке (с вкладкой до и после), то я бы выстроил строку, аналогичную этой работе, или, я полагаю, синтаксис совершенно неправильный: 1018 *

grep -Evf idsfile.csv datafile.txt > output.txt

Ответы [ 3 ]

1 голос
/ 04 декабря 2010

Одна строка данных в idsfile.csv враждебна этому рабочему процессу - вам придется преобразовать его в серию строк.Набор инструментов Unix основан на строках!

Итак, нам нужно транслитерировать запятые в новые строки:

tr , '\012' < idsfile.csv > idsfile.lines
fgrep -f idsfile.lines datafile.txt

POSIX-совместимый 'grep' также распознает:

grep -F -f idsfile.lines datafile.txt

Возможно, вам даже удастся сойти с рук:

tr , '\012' < idsfile.csv |
grep -F -f - datafile.txt

Это говорит 'grep', что он читает список имен для поиска из стандартного ввода.

Наконец,если вы используете GNU grep, вы можете добавить '-w' для поиска слов - для этого потребуется, чтобы шаблон был окружен не буквенно-цифровыми символами (пробелы в примерах).Опция '-w' означает, что если строка в datatfile.txt содержит

something 000002100  kkkk

, запись' 000021 'не выберет эту строку (без' -w 'она будет выбрана).

1 голос
/ 04 декабря 2010

Следующая 1-строчная строка использует awk, чтобы превратить каждое поле файла csv в список регулярных выражений для grep для сопоставления с помощью параметра -f. Затем мы используем Bash процесс подстановки синтаксис <( ), чтобы обработать вывод команды awk как файл (именованный канал).

$ grep -w -f <(awk -v 'RS=,|\n' '{print "\t"$0"\t"}' sample.csv) title.txt

Input

$ cat sample.csv
000001,000003,000005,000007,000008,000009,000011,000023,000029

$ cat title.txt
titl e1 000001  description1
title2  000003  descr iption2
ti tle3 000021  des cripti on3
title4  000023  description4

выход

$ grep -w -f <(awk -v 'RS=,|\n' '{print "\t"$0"\t"}' sample.csv) title.txt
titl e1 000001  description1
title2  000003  descr iption2
title4  000023  description4

Обратите внимание , что строка, содержащая 000021, не совпадает. Также неочевидно, что каждое 6-значное число в title.txt окружено символами табуляции, а не пробелами.

1 голос
/ 04 декабря 2010

Используйте sed для преобразования содержимого idsfile.csv в регулярное выражение для использования с grep.

...