Транспонировать строки в столбец после n-го столбца в bash - PullRequest
1 голос
/ 13 марта 2019

У меня есть файл, подобный следующему формату:

$ cat file_in.csv

1308123;28/01/2019;28/01/2019;22/01/2019
1308456;20/11/2018;27/11/2018;09/11/2018;15/11/2018;10/11/2018;02/12/2018
1308789;06/12/2018;04/12/2018  
1308012;unknown

Как я могу транспонировать, как показано ниже, начиная со второго столбца:

1308123;28/01/2019  
1308123;28/01/2019  
1308123;22/01/2019  
1308456;20/11/2018  
1308456;27/11/2018  
1308456;09/11/2018  
1308456;15/11/2018  
1308456;10/11/2018  
1308456;02/12/2018  
1308789;06/12/2018  
1308789;04/12/2018  
1308012;unknown

Я тестирую свой скрипт, но получаюнеправильный результат

echo "123;23/05/2018;24/05/2018" | awk -F";" 'NR==3{a=$1";";next}{a=a$1";"}END{print a}'

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

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
0 голосов
/ 14 марта 2019

Еще один awk

awk -F";" '{ OFS="\n" $1 ";"; $1=$1;$1=""; printf("%s",$0) } ' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...