Как объединить колонку с несколькими хитами с Awk - PullRequest
0 голосов
/ 14 июня 2019

У меня есть такой файл таблицы, joj001.txt:

C00299  map01
C00125  map65
C00299  map13

и CSV-файл, dora.csv:

V1    V2       V3
D12   C00299   4
E10   C01832   5

Я хочу добавить столбец (или сгенерировать новый CSV-файл) со всеми попаданиями, когда столбец V2 содержит ключи, например:

V1    V2        V3    V4
D12   C00299    4    map01,map13
E10   C01835    5

Но пока у меня есть это:

$ awk -F'\t' -vOFS="\t" 'FNR==NR{a[$1]=$2; next}{print $0,a[$2]}' joj001.txt mia.csv

V1    V2        V3    V4
D12   C00299    4    map13
E10   C01835    5

Как получить все вхождения, разделенные запятой?

Спасибо тебе

1 Ответ

0 голосов
/ 15 июня 2019

Ваш скрипт перезаписывает значение в a[$1] вместо добавления к нему.

Есть много способов добавить вместо. Например:

if ( a[$1] ) a[$1] = a[$1] "," $2; else a[$1] = $2

a[$1] = a[$1] ( a[$1] ? "," : "" ) $2

a[$] = ( a[$1] ? a[$1] "," : "" ) $2

a[$1] = a[$1] ? a[$1] "," $2 : $2


a[$1] = a[$1] "," $2;
# then once at the end:
sub(/^,/,"",a[$1])

Вам также необходимо вставить новый заголовок столбца.

Итак:

awk -F '\t' -v OFS='\t' '
    FNR==NR { a[$1] = a[$1] ? a[$1] "," $2 : $2; next }
    FNR==1 { print $0, "V4"; next }
    { print $0, a[$2] }
' joj001.txt mia.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...