Объединение двух CSV-файлов на основе столбца

У меня есть 2 CSV-файла следующим образом

AllEmpployees.txt
EmpID,Name

QualifiedEmployeees.csv
Empid

Теперь я хочу найти имена квалифицированных сотрудников

Empid,Name

Использую следующую команду

   join -t , -1 1 -2 1 QualifiedEmployeees.csv AllEmployees.txt

Это приводит к нулю записей. Уверен, что есть пересечение сотрудников.

Ссылка: https://superuser.com/questions/26834/how-to-join-two-csv-files

Это потому, что файл квалифицированных сотрудников имеет только один столбец, а разделитель отсутствует? Или я делаю что-то не так?

4 ответа

Решение

Попробуй это:

join -t "," <(dos2unix <QualifiedEmployeees.csv) <(dos2unix <AllEmpployees.txt)
awk -F, 'FNR==NR{a[$1];next}($1 in a){print $2}' Qualiedemployees.txt allEmployees.txt

Если join не работает (не производит столько строк, сколько вы ожидаете, или вообще не производите строк), скорее всего, потому что ваш ввод не отсортирован. От man join мы видим это:

При использовании символов разделителя полей по умолчанию файлы, подлежащие объединению, должны быть упорядочены в порядке сортировки сортировки (1), с использованием опции -b, в полях, к которым они должны быть присоединены, в противном случае объединение может не выполняться. сообщить обо всех полевых матчах. Когда символы-разделители полей указываются с помощью опции -t, последовательность сортировки должна быть такой же, как sort(1) без опции -b.

join требует сортировки входных файлов, а также может давать неточные результаты, если ввод имеет окончания строки DOS.

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

awk -F, -v RS='[\r\n]+' 'FNR==NR{quals[$1]; next} $1 in quals' QualifiedEmployeees.csv AllEmployees.txt

000009929745,a
000009929745,c
000009929745,d
000009929745,e
Другие вопросы по тегам