Объединение двух 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