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

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

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

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

  • Как вставить содержимое файла в строку в bash
  • Переименовать команду для удаления подстроки
  • Разделить файл на два
  • Сравните 2 файла с разделителями табуляции и выходных различий с заголовком столбца
  • grep -v: как исключить только первые (или последние) N строк, которые соответствуют
  • Использование sed для редактирования строк в файле с переменной
  •   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 + как добавить список в файл
  • awk: разобрать и записать в другой файл
  • awk каталог файлов
  • Управляющий символ в awk-выходе
  • Объединение определенных столбцов из 2 файлов на основе совпадения полей
  • 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]; }' 
    Interesting Posts

    Сделать ярлык для программы, которая меняет ее каталог

    выключение программы не прекращается после планирования выключения

    Perl однострочный для замены значений, превышающих пороговое значение

    Перенаправить вывод фонового процесса на пейджер «меньше» после завершения работы не до терминала по умолчанию

    как объединить разные файлы, имеющие один и тот же заголовок, но немного другое имя файла?

    При связывании настраивайте ли настройки (например, количество / размер очередей RX) непосредственно на интерфейсе главной связи или на подчиненных этажных интерфейсах?

    Как использовать параметр EXTRA_FIRMWARE_DIR?

    Файлы по умолчанию в домашнем каталоге для каждого пользователя

    Какие инструменты могут показать мне использование ЦП, которое не отображается в top / sar?

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

    Linux и Unix - лучшая ОС в мире.