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

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

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

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

  • Печать многострочной переменной в столбце
  • `cut`: выбор столбцов, содержащих строку
  • Как стандартизировать количество символов в столбце?
  • Печать некоторых полей / etc / passwd
  • Как этот awk выравнивает интервал?
  • Транспонирование строк и столбцов
  •  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 

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

  • Почему вывод «столбца» смещен с помощью цветного ввода ANSI?
  • Top Command - Как уменьшить отображаемые столбцы
  • Добавить символ в начало и конец столбца
  • Как сортировать и присоединяться одновременно?
  • добавлять поля из разных файлов
  • Как получить число символов в одном столбце?
  • 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 
    Linux и Unix - лучшая ОС в мире.