Как удалить строки из файла CSV на основе списка значений из другого файла? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть два файла:

candidates.csv:

id,value
1,123
4,1
2,5
50,5

blacklist.csv:

1
2
5
3
10

Я хочу удалить все строки из candidates.csv, в котором первый столбец (id) имеет значение, содержащееся в blacklist.csv.id всегда числовой.В этом случае я хотел бы, чтобы мой вывод выглядел так:

id,value
4,1
50,5

Пока что мой скрипт для идентификации дублирующих строк выглядит так:

cat candidates.csv | cut -d \, -f 1 | grep -f blacklist.csv -w

Это дает мнеoutput

1
2

Теперь мне как-то нужно передать эту информацию обратно в sed / awk / gawk / ..., чтобы удалить дубликаты, но я не знаю как.Любые идеи, как я могу продолжить отсюда?Или вообще есть лучшее решение?Мое единственное ограничение - это запуск в bash.

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Вы можете использовать sed и grep вместе, чтобы получить вывод

$ sed -e 's/[0-9]+/&\,/g' blacklist.csv > filter.csv
$ grep -Fvf filter.csv candidates.csv
id,value
4,1
50,5

sed Команда добавляет , к каждому id и выводит к filter.csv.E предназначен для интерпретации регулярных выражений в MacOSX / FreeBSD, так же, как -r в GNU sed.

grep использует опцию f для сравнения между файлами, а затем удаляет строки с помощью v.F для фиксированной строки.

0 голосов
/ 04 октября 2018

Если вас не слишком беспокоит порядок строк в вашем файле candidates.csv, вы можете использовать следующее:

join -v 1 -t, <(sort -t, candidates.csv) <(sort blacklist.csv)

-v 1 запрашивает все строки из первого файла (отсортированы candidates.csv), которые не совпадают в первом поле со вторым файлом (blacklist.csv).-t, просто устанавливает запятую в качестве разделителя.

Если вас беспокоит строка заголовка в файле candidates.csv, вы можете удалить ее перед сортировкой или изменить порядок.

0 голосов
/ 04 октября 2018

А как насчет следующего:

 awk -F, '(NR==FNR){a[$1];next}!($1 in a)' blacklist.csv candidates.csv

Как это работает?

Программа awk представляет собой серию пар шаблон-действие, записанных как:

condition { action }
condition { action }
...

, где condition обычно является выражением, а action - серией команд.Здесь первые пары условие-действие читаются следующим образом:

  • (NR==FNR){a[$1];next}, если общее количество записей NR равно количеству записей файла FNR (т.е. если мы читаем первый файл)сохранить все значения в массиве a и перейти к следующей записи (больше ничего не делать)
  • !($1 in a), если первое поле отсутствует в массиве a, затем выполнить действие по умолчанию, котороенапечатать строку.Это будет работать только для второго файла, поскольку условие первой пары условие-действие не выполняется.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...