簡體   English   中英

使用awk行到列

[英]row to column using 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
. 
.

非常感謝!

需要多字符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

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

@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM