使用awk行到列

时间:2018-11-27 19:27:33

标签: unix awk

我想知道如何使用awk将以下内容(“旧”)转换为“ New1”和“ New2”:

旧:

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 :(得分:2)

多字符RS需要gawk:

$ 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

答案 1 :(得分:1)

要获取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

答案 2 :(得分:1)

@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,因为它是默认值,否则,两个脚本都相同(基本上与另一个引用的答案相同)。

答案 3 :(得分:0)

任何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