1-е решение: Решение Eaisest будет проходить циклом по всем полям (разумеется, установлен разделитель полей как ;
), а затем печатать $1
вместе со всеми полями в новая линия. Также обратите внимание, что цикл выполняется от i=2
до значения NF
, оставляя первое поле, поскольку нам нужно печатать новую строку, начиная со столбца 2 и далее.
awk 'BEGIN{FS=OFS=";"} {for(i=2;i<=NF;i++){print $1,$i}}' Input_file
2-е решение: Использование 1 функциональности подстановки времени (sub
) и глобальных подстановок (gsub
) awk
. Здесь я изменяю самое первое вхождение ;
на @@@
(предполагается, что ваш Input_file НЕ будет содержать эти символы вместе, если он там, выберите какие-либо уникальные символы, которые НЕ находятся в одном Input_file вместо @@@
), затем глобально подставляя ;
(все случаи) с ORS
val (переменная, имеющая значение $ 1) и ;
, поэтому задайте значения в новом столбце. Теперь, наконец, удалите @@@
из первого поля. Почему мы сделали такой подход, если мы НЕ заменяем самый первый вхождение ;
каким-либо другим символом, тогда перед заменой будет помещена НОВАЯ ЛИНИЯ, которую мы НЕ хотим иметь. (Также согласно комментарию Эда Сэра это решение было протестировано в 1 файле Input_file и может иметь проблемы при чтении нескольких файлов Input_file)
awk 'BEGIN{FS=OFS=";"} {val=$1;sub(";","@@@");gsub(";",ORS val ";");sub("@@@",";",$1)} 1' Input_file