Как отформатировать выходной файл с помощью awk - PullRequest
0 голосов
/ 02 июня 2018

У меня есть следующий файл вывода в следующем формате из сценария оболочки

data  text1

data1 text2

data3 text4,text5,text6,text7,text8,text9,text10,text12,text11,text13

data4 text53

data23 text45,text65,text98,text65`

Хотите изменить формат вывода далее, как показано ниже, чтобы сделать его более читабельным

data   text1

data1  text2

data3  text4

data3  text5

data3  text6

data3  text7

data3  text8

data3  text9

data3  text10

data4  text53

data23 text45

data23 text65

data23 text98

data23 text65

Посоветуйте, пожалуйста, как добиться того же, используя awk / sed?попытался найти команды awk, но не получил никакой подсказки, поэтому любая помощь будет признательна. Спасибо

Ответы [ 4 ]

0 голосов
/ 02 июня 2018
$ awk -F'[ ,]+' '{for (i=2;i<=NF;i++) print $1, $i ORS}' file
data text1

data1 text2

data3 text4

data3 text5

data3 text6

data3 text7

data3 text8

data3 text9

data3 text10

data3 text12

data3 text11

data3 text13

data4 text53

data23 text45

data23 text65

data23 text98

data23 text65
0 голосов
/ 02 июня 2018

Другое использование gsub - ,:

$ awk '{gsub(/,/, ORS ORS $1 OFS )}1' file
...
data3 text4

data3 text5

data3 text6
...

Однако, если $1 содержит, например, &, возникнут проблемы, так как он будет заменен на совпадение:

$ cat file
data& text4,text5,text6
$ awk '{gsub(/,/, ORS ORS $1 OFS )}1' file
data& text4

data, text5

data, text6

Исправьте это с помощью другого gsub:

$ awk '{gsub(/,/, ORS ORS $1 OFS ); gsub(/,/,"\\&")}1' file
data& text4

data& text5

data& text6
0 голосов
/ 02 июня 2018

Вы можете сложить линию один раз с помощью

sed -r 's/([^ ]* +)([^,]*),(.*)/\1\2\n\n\1\3/g' file

Для повторения необходимо маркерный прыжок

sed -r ': a;s/([^ ]* +)([^,]*),(.*)/\1\2\n\n\1\3/g; t a' file
0 голосов
/ 02 июня 2018

Вы можете использовать что-то вроде этого:

output | gawk '{split($2, a, /,/); for (i=1; i <= length(a); i++) {printf "%s %s\n\n", $1, a[i]}}'

Где output - это вывод, сгенерированный вашим скриптом.

В качестве альтернативы вы можете запустить его так:

gawk '{split($2, a, /,/); for (i=1; i <= length(a); i++) {printf "%s %s\n\n", $1, a[i]}}' output_file

Отредактировано для исправления ошибок, указанных @Ed Morton, и заменено awk на gawk, поскольку length(array) является расширением GNU.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...