Как найти уникальные поля в файле CSV? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть CSV-файл с 5 столбцами: name firstname phone room email

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

например

  • Дан; B ;; B10.12 ;;
  • Лиз; B ;; B10.12 ;;
  • Джер; B ;; C15.1 ;;

Я должен получить только Jer B C15.1 в качестве результата.

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

input="collaborateurs.csv"
while read line; do
    room=$(echo $line | cut -d \; -f 4)
    if [ -n "$room" ]; then
        firstname=$(echo $line | cut -d \; -f 2)
        name=$(echo $line | cut -d \; -f 1)
        echo "${firstname} ${name} -> ${room}"
    fi
done < ${input}

Ответы [ 3 ]

2 голосов
/ 23 октября 2019

Сначала вы должны выполнить поиск по каждой комнате, отсортировать данные и получить уникальные комнаты. Если комната имеет ровно одно вхождение, она сохраняется в массиве UNIQUE:

UNIQUE=($(grep -Eo ';[A-Z][0-9]+\.[0-9]+;' tst.csv | sort | uniq -u));
for i in ${UNIQUE[@]}; do
    grep $i tst.csv;
done

. В результате получается:

Jer;B;;C15.1;;
1 голос
/ 23 октября 2019

В вашем цикле вы можете проверить, использует ли кто-то комнату комнату с

if test $(grep ";$room;" -c file) -eq 1

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

Итак, для вашего примера, если вы хотите отображать строки только в том случае, если их комната уникальна, вы можете сделать

input="collaborateurs.csv"
while read line; do
    room=$(echo $line | cut -d \; -f 4)
    if test $(grep ";$room;" -c file) -eq 1
        then echo "$line"
    fi
done < "$input"

Примечание: это предполагает, что никакое другое поле не может содержать идентификационный номер комнаты. Если это возможно, вам понадобится другое регулярное выражение, например .*;.*;.*;$room;.*;

Надеюсь, это поможет!

1 голос
/ 23 октября 2019
  1. Создание массива для каждой комнаты
  2. Считывание файла построчно, извлечение имени комнаты и человека и добавление этого имени в соответствующий массив комнаты
  3. После того, как вы покрасите все строки, проверьте,любой комнатный массив имеет только один элемент, если этот парень один, найдите его имя, найдите его в файле и отобразите эту строку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...