Добавить столбец из одного файла в другой на основе нескольких совпадений, сохраняя при этом несоответствие - PullRequest
0 голосов
/ 08 января 2020

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

У меня есть файл small.csv:

id,name,x,y,id2
1,john,2,6,13
2,bob,3,4,15
3,jane,5,6,17
4,cindy,1,4,18

и другой файл big.csv:

id3,id4,name,x,y
100,{},john,2,6
101,{},bob,3,4
102,{},jane,5,6
103,{},cindy,1,4
104,{},alice,7,8
105,{},jane,0,3
106,{},cindy,1,7

Проблема с этим я пытаюсь поместить id2 small.csv в столбец id4 big.csv, только если name AND x AND y совпадает. Я попытался использовать разные команды awk и join в Git Bash, но я не могу. Опять же, я прошу прощения за новый взгляд ie на все это, но любая помощь будет потрясающей. Заранее спасибо.

РЕДАКТИРОВАТЬ: Извините, вот как должен выглядеть окончательный желаемый результат:

id3,id4,name,x,y
100,{13},john,2,6
101,{15},bob,3,4
102,{17},jane,5,6
103,{18},cindy,1,4
104,{},alice,7,8
105,{},jane,0,3
106,{},cindy,1,7

И одним из последних испытаний, которые я сделал, было следующее:

$ join -j 1 -o 1.5,2.1,2.2,2.3,2.4,2.5 <(sort -k2 small.csv) <(sort -k2 big.csv)

Но я получил эту ошибку:

join: /dev/fd/63: No such file or directory

1 Ответ

0 голосов
/ 09 января 2020

Вероятно, нетривиально решить с помощью join, но довольно просто с awk:

awk -F, -v OFS=, ' # set input and output field separators to comma

    # create lookup table from lines of small.csv
    NR==FNR {
        # ignore header
        # map columns 2/3/4 to column 5
        if (NR>1) lut[$2,$3,$4] = $5
        next
    }

    # process lines of big.csv
    # if lookup table has mapping for columns 3/4/5, update column 2
    v = lut[$3,$4,$5] {
        $2 = "{" v "}"
    }

    # print (possibly-modified) lines of big.csv
    1

' small.csv big.csv >bignew.csv

Код предполагает, что small.csv содержит только одну строку для каждого отдельного столбца 2/3 / 4.

NR==FNR { ...; next } - это способ обработки содержимого первого аргумента файла. (FNR меньше NR при обработке строк из второго и последующих аргументов файла. next пропускает выполнение оставшихся команд awk.)

...