我需要将匹配的行范围打印到一行上。
文件包含:
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
可以在单行上输出我的范围的语法。(为清楚起见进行了编辑)
我需要将匹配的行范围打印到一行上。
文件包含:
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
可以在单行上输出我的范围的语法。(为清楚起见进行了编辑)
这应该工作
awk '/start/,/stop/{if($0 ~ /stop/){print}; if($0 !~ /stop/){printf $0" "}}' file
awk '{ORS = $1 == "stop" ? "\n" : " "; print}'
一个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
gawk '$1 ~ /^start$/{in_range = 1; ORS = " ";} $1 ~ /^stop/{in_range = 0; ORS = "\n"; print $0; next;} in_range{print $0}' test2.txt