在awk中将一系列行打印到一行

时间:2013-10-21 20:28:37

标签: awk

我需要在一行上打印匹配的行范围。

文件包含:

banana
start
1
2
3
stop
banana
banana
start
5
6
stop

我需要将其输出为

start 1 2 3 stop
start 5 6 stop

我目前正在使用基本/start/,/stop/{print $0}语法来获取我的范围,但是 我正在寻找一种awk的语法,它将在单行上输出我的范围。 (为清晰起见编辑)

4 个答案:

答案 0 :(得分:3)

这应该有效

awk '/start/,/stop/{if($0 ~ /stop/){print}; if($0 !~ /stop/){printf $0" "}}' file

答案 1 :(得分:1)

gnu awk版本(由于某些awk上的RS限制)

awk '$1=$1 {print $0,RS}' RS="stop" file

更强大的版本

awk '{$1=$1} $0 {print $0,RS}' RS="stop" file

这适用于所有awk版本

awk '/stop/ {print;next} {printf "%s ",$0}' file

香蕉版

awk '/start/ {f=1} f {s=s?s" "$0:$0} /stop/ {print s;f=s=0}' file

答案 2 :(得分:1)

awk '{ORS = $1 == "stop" ? "\n" : " "; print}'

答案 3 :(得分:0)

gawk '$1 ~ /^start$/{in_range = 1; ORS = " ";} $1 ~ /^stop/{in_range = 0; ORS = "\n"; print $0; next;} in_range{print $0}' test2.txt