Объединение нескольких полей отдельно на основе одной (ключевой) колонки

У меня есть тестовые данные, разделенные табуляцией:

A 1 2 B 3 4 B 5 6 C 7 8 

Я хочу объединить (заполнить) оба столбца # 2 и # 3 на основе повторяющихся значений в столбце 1, например:

  A 1 2 B 3;5 4;6 C 7 8 

В настоящее время рабочий код, который я разработал на основе решений здесь (объединение нескольких строк на основе столбца 1 ), не объединяет значения нескольких столбцов отдельно:

  <test.txt awk -F"\t" '{OFS="\t"} {a[$1]=($1 in a)?a[$1]";"$2FS$3:$1FS$2FS$3} END{for(i in a){print a[i]}}' 
  A 1 2 B 3 4;5 6 C 7 8 

Было бы очень полезно, если кто-то может помочь указать на ошибку в моем коде. Я пробовал несколько вариантов, но не мог отформатировать его должным образом.

  • утечка памяти awk?
  • Как я могу отредактировать последние n строк в файле?
  • Удаление шаблонов только из 1-го столбца
  • Как манипулировать CSV-файлом с помощью sed или awk?
  • Добавьте mtime к выходу grep -c и отсортируйте результат по mtime
  • Разделение файлов в Unix с использованием значений в файле
  • Переносная проверка массива
  • Как напечатать следующий n-й столбец в текущей строке после соответствия шаблону?
  • 2 Solutions collect form web for “Объединение нескольких полей отдельно на основе одной (ключевой) колонки”

    Используйте отдельные переменные, чтобы содержать конкатенированные значения каждого столбца.

     awk -F'\t' -v OFS='\t' '{ if ($1 in a) { a[$1] = a[$1]";"$2; b[$1] = b[$1]";"$3; } else { a[$1] = $2; b[$1] = $3; } } END { for (i in a) print i, a[i], b[i] }' < test.txt 

    Бит поздно, но вот альтернатива, использующая синтезированный вспомогательный массив:

     awk -v OFS='\t' '{ if ($1 in arr) { split(arr[$1], subArr); arr[$1] = subArr[1] ";" $2 OFS subArr[2] ";" $3; } else { arr[$1] = $2 OFS $3 } } END { for (i in arr) print i,arr[i]; }' 
    Linux и Unix - лучшая ОС в мире.