Unix: найти повторяющиеся вхождения в столбце в CSV-файле, пропустить одно возможное значение - PullRequest
0 голосов
/ 26 мая 2018

Я надеюсь, что одна или две строки кода для сценария bash найдут и напечатают повторяющиеся элементы в столбце в CSV-файле 2.5G, за исключением элемента, который, как я знаю, обычно повторяется.

Файл данных имеет заголовок, но он не дублируется, поэтому меня не беспокоит код, который учитывает наличие заголовка.

Вот иллюстрация того, как выглядят данныекак:

header,cat,Everquest,mermaid
1f,2r,7g,8c
xc,7f,66,rp
Kf,87,gH,||
hy,7f,&&,--
rr,2r,89,))
v6,2r,^&,!c
92,@r,hd,m
2r,2r,2r,2r
7f,7f,7f,7f
9,10,11,12
7f,2r,7f,7f
76,@r,88,u|

Я ищу вывод:

7f
@r

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

Для ясности, я не могу знать значения дубликатов, кроме общих, которые в моих реальных файлах данных на самом деле являются словом "нет".Это '2r' выше.

Я читаю здесь , что я могу сделать что-то вроде

awk -F, ' ++A[$2] > 1 { print $2; exit 1 } ' input.file

Однако я не могу понять, как пропустить '2r' и что++ значит.

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

Кроме того,

uniq -d 

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

Заранее благодарю за помощь.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

как пропустить '2r' :

$ awk -F, ' ++a[$2] == 2 && $2 != "2r" { print $2 } ' file
7f
@r

++a[$2] добавляет элемент в хеш-массив и увеличивает его значение на 1, т.е. подсчитывает, сколько вхождений каждого значенияво втором столбце существуют.

0 голосов
/ 26 мая 2018
  1. Получить только второй столбец, используя cut -d, -f2
  2. sort
  3. uniq -d, чтобы получить повторяющиеся строки
  4. grep -Fv 2r, чтобы исключить значениеили grep -Fv -e foo -e bar … для исключения нескольких значений

Другими словами, что-то вроде этого:

cut -d, -f2 input.csv | sort | uniq -d | grep -Fv 2r

В зависимости от данных, это может быть быстрее, если вы переместите grep ранее вконвейер, но вы должны проверить это с помощью некоторого бенчмаркинга.

...