Unix 使用awk从行到列
我想知道如何使用awk将以下(“旧”)转换为“新1”和“新2”: 旧的: 新1: 新2: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 '/
非常感谢 要获取
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
或exact5
开头的行您可能还需要添加$
右边界,否则51
将触发一条新记录(但不确定域是否允许)@karakfa您对$
和51的看法是正确的。我不知道确切的要求是什么。以5
或exact5
开头的行这也改进了参考答案,对RS
使用regexp,然后忽略第一条(空)记录,使动作主体更清晰。这也改进了参考答案,对RS
使用regexp,然后忽略第一条(空)记录,使身体更干净。