3

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

文件包含:

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

4 回答 4

3

这应该工作

awk '/start/,/stop/{if($0 ~ /stop/){print}; if($0 !~ /stop/){printf $0" "}}' file
于 2013-10-21T20:51:32.100 回答
1
awk '{ORS = $1 == "stop" ? "\n" : " "; print}'
于 2013-10-21T21:05:01.590 回答
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
于 2013-10-21T20:57:27.243 回答
0
gawk '$1 ~ /^start$/{in_range = 1; ORS = " ";} $1 ~ /^stop/{in_range = 0; ORS = "\n"; print $0; next;} in_range{print $0}' test2.txt
于 2014-08-27T14:17:17.993 回答