Unix 使用awk从行到列

Unix 使用awk从行到列,unix,awk,Unix,Awk,我想知道如何使用awk将以下(“旧”)转换为“新1”和“新2”: 旧的: 新1: 新2: 非常感谢 要获取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 要获取new1: awk '/

我想知道如何使用awk将以下(“旧”)转换为“新1”和“新2”:

旧的:

新1:

新2:


非常感谢

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

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

对于多字符
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

对于多字符
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

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

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

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

欢迎来到SO。Stack Overflow是专业和热情的程序员的问答页面。在问题中添加您自己的代码。你至少要展示你自己为解决这个问题所做的研究。欢迎来到这里。Stack Overflow是专业和热情的程序员的问答页面。在问题中添加您自己的代码。你至少要展示你自己为解决这个问题所做的大量研究。
print(NR>1?5 OFS$0:$0)
效果会更好,所以你可以通过设置
OFS=“”
或设置为
Genius,一如既往,@karakfa,为这两个问题提供相同的代码。更新<代码>打印(NR>1?5 OFS$0:$0)
效果会更好,因此您可以通过设置
OFS=“”
或设置为
Genius(一如既往,@karakfa)来为这两种格式设置相同的代码。更新!您可能还需要添加
$
右边界,否则
51
将触发新记录(但不确定域是否允许)@karakfa您对
$
和51的看法是正确的。我不知道确切的要求是什么。以
5
或exact
5
开头的行您可能还需要添加
$
右边界,否则
51
将触发一条新记录(但不确定域是否允许)@karakfa您对
$
和51的看法是正确的。我不知道确切的要求是什么。以
5
或exact
5
开头的行这也改进了参考答案,对
RS
使用regexp,然后忽略第一条(空)记录,使动作主体更清晰。这也改进了参考答案,对
RS
使用regexp,然后忽略第一条(空)记录,使身体更干净。