строка в столбец с использованием awk - PullRequest
0 голосов
/ 27 ноября 2018

Я хотел бы знать, как я мог бы преобразовать следующее ('Старый') в 'New1' и 'New2', используя awk:

Old:

5
21
31
4
5
11
12
15
5
19
5
12
5
.
.

New1:

5 21 31 4
5 11 12 15
5 19
5 12
. 
.

New2:

521314
5111215
519
512
. 
.

Большое спасибо!

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

с любым awk:

$ awk -v ORS= '{print ($0==5 ? ors : OFS) $0; ors=RS} END{print ors}' file
5 21 31 4
5 11 12 15
5 19
5 12

$ awk -v ORS= -v OFS= '{print ($0==5 ? ors : OFS) $0; ors=RS} END{print ors}' file
521314
5111215
519
512
0 голосов
/ 27 ноября 2018

Требуется gawk для многосимвольных RS:

$ awk 'BEGIN {RS="\n5\n"} {$1=$1; print (NR>1 ? 5 OFS $0 : $0)}' file
5 21 31 4
5 11 12 15
5 19
5 12   

Для второй версии просто установите OFS в пустую строку:

$ awk -v OFS="" 'BEGIN {RS="\n5\n"} {$1=$1; print (NR>1 ? 5 OFS $0 : $0)}' file
521314
5111215
519
512
0 голосов
/ 27 ноября 2018

некоторые варианты сценария @ jas

$ awk -v RS="(^|\n)5\n" -v OFS='' 'NR>1{$1=$1; print 5,$0}' file
521314
5111215
519
512

$ awk -v RS="(^|\n)5\n" -v OFS=' ' 'NR>1{$1=$1; print 5,$0}' file
5 21 31 4
5 11 12 15
5 19
5 12

во втором случае вам не нужно явно указывать OFS, поскольку это значение по умолчанию, в противном случае оба сценария совпадают (по сути, такие же, какдругой ссылочный ответ).

0 голосов
/ 27 ноября 2018

Чтобы получить new1:

awk '/^5/{printf "%s", (NR>1?RS:"")$0;next}{printf " %s",$0}END{print ""}' file

Чтобы получить new2:

awk '/^5/{printf "%s", (NR>1?RS:"")$0;next}{printf "%s",$0}END{print ""}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...