Как отделить содержимое первого столбца в разных строках

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

Class1,Class2 info1 info2 info3 info4 Class3 info1a info2a info3a info4a Class4,Class5 info1b info2b1,info2b2 info3b info4b 

Когда у меня в первом столбце данные разделяются запятой, я хотел бы разделить его разными строками с одинаковой информацией из 2-го-5-го столбца, например:

 Class1 info1 info2 info3 info4 Class2 info1 info2 info3 info4 Class3 info1a info2a info3a info4a Class4 info1b info2b1,info2b2 info3b info4b Class5 info1b info2b1,info2b2 info3b info4b 

Я не знаю, как это сделать. Любое предложение?

  • Как сортировать и присоединяться одновременно?
  • добавлять поля из разных файлов
  • Добавить / Добавить столбец в качестве первого столбца в файл с разделителями табуляции
  • как добавить несколько пробелов между столбцами в Unix
  • AWK - вопрос о столбцах
  • Фильтровать большие наборы данных в датах с командной строкой
  • Вывод экрана в столбцы, чтобы использовать ширину экрана и избежать прокрутки
  • Как извлекать уникальные значения в столбцах
  • 3 Solutions collect form web for “Как отделить содержимое первого столбца в разных строках”

    Решение awk :

     awk '$1~/.+,.+/{ split($1,a,","); $1=""; sub(/^ */,"",$0); for(i=1;i<=length(a);i++) print a[i],$0; next }1' file 

    Выход:

     Class1 info1 info2 info3 info4 Class2 info1 info2 info3 info4 Class3 info1a info2a info3a info4a Class4 info1b info2b1,info2b2 info3b info4b Class5 info1b info2b1,info2b2 info3b info4b 

    • $1~/.+,.+/ – строка процесса, если 1-й столбец содержит элементы, разделенные запятыми
    • split($1,a,",") – разделение 1-го столбца на массив элементов
     perl -F'\t' -lane '$,="\t"; print $_, @F for split /,/, splice @F, 0, 1; ' yourfile 

    Результаты

     Class1 info1 info2 info3 info4 Class2 info1 info2 info3 info4 Class3 info1a info2a info3a info4a Class4 info1b info2b1,info2b2 info3b info4b Class5 info1b info2b1,info2b2 info3b info4b 

    POSIX sed

     TAB=$(printf \\t) NL=$(printf \\nn | sed -e '$!s/$/\\/') sed -e "s/^\([^,${TAB}]*\),\([^${TAB}]*\)\(.*\)/\1\3${NL%?}\2\3/;P;D" yourfile 

    Сначала мы определяем переменные TAB и newline, которые можно использовать в команде с двойными кавычками sed в отсутствие escape-последовательности \t и \n которая недоступна в POSIX sed на lhs и rhs соответственно команды s/// sed ,


    Результаты

     Class1 info1 info2 info3 info4 Class2 info1 info2 info3 info4 Class3 info1a info2a info3a info4a Class4 info1b info2b1,info2b2 info3b info4b Class5 info1b info2b1,info2b2 info3b info4b 
    Interesting Posts

    Данные трубы на другую машину с нологином

    Установлен Centos 7 после Windows и не может загрузиться в CentOS

    Как я могу найти пакет Ubuntu для использования с Amazon EC2?

    неразрешенные зависимости файлов bz * для rpm из источника

    Пользователь Ghost? Пользователь не отображается на экране входа в систему или в команде «users»

    Установка GRUB-EFI не работает при установке Kali Linux на внешний жесткий диск

    Показывать список файлов в текущем каталоге во время навигации? (Экран, Linux)

    Как объединить значения из двух столбцов?

    Linux-загрузчики, поддерживающие полное шифрование диска?

    Вырезать строку-Catch: есть файл с тем же именем, что и строка в том же пути

    Будет ли «*» (звезда) в globbing соответствовать только символам (т. Е. Az и 0-9)?

    Заменить поля в файле inline

    Создание графиков из базы данных с полем Время / Дата

    Загрузка PXE Live CD

    Изменить привязку порта с 127.0.0.1 до 0.0.0.0 на Oracle Linux 6 (RHEL 6)

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