Скрипт Bash для объединения двух CSV-файлов с одинаковым полем и вывода в третье поле - PullRequest
0 голосов
/ 03 марта 2019

У меня есть 2 CSV-файла.file1.csv и file2.csv со следующими именами полей

file1.csv: user_id, email

file2.csv: user_id, first_name, second_name

Я создал bashскрипт для объединения двух CSV-файлов:

#!/bin/bash

#Script to merge two csv files based on user_id


join --header -t, <(sort -t, -k1 file_a.csv) <(sort -t, -k1 file_b.csv) > file3.csv

Единственная проблема заключается в том, что выходные данные помещают имена столбцов user_id, email, first_name, last_name в 3 строки снизу, смешанные с данными.У кого-нибудь есть идея, как мне исправить это, чтобы вернуть имена полей наверх?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Вы можете просто написать:

join --header -t, <(
    { read;echo $REPLY;sort -t, -k1;}<file_a.csv
  ) <(
    { read;echo $REPLY;sort -t, -k1;}<file_b.csv
  ) > outputfile.csv

Или вы можете создать функцию:

hsort() {
    {
        read
        echo $REPLY
        sort -t, -k1
    } < "$1"
}

Тогда

join --header -t, <(hsort file_a.csv) <(hsort file_b.csv) >outputfile.csv
0 голосов
/ 03 марта 2019

Ваш сортировка смешивает заголовок с данными, к сожалению, сортировка не имеет опции ignore header .Здесь awk приходит на помощь!

Сначала определите функцию

$ function sorth() { awk 'NR==1; NR>1{print | "sort"}' "$1"; }

, теперь вы можете

$ join --header -t, <(sorth file1) <(sorth file2)

NB Я неНе думаю, что сортировка с -k1 добавляет здесь любое значение, но, возможно, отличается в вашей локали.Если это так, добавьте параметры в сценарий awk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...