将一系列行打印到awk中的一行上

将一系列行打印到awk中的一行上,awk,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/

我需要在一行上打印一系列匹配的行

文件包含:

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

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


更健壮的版本

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

您不需要分号
您应该始终为
printf
指定格式,并将
printf$0”“
更改为
printf“%s”、$0
。如果文件确实包含eks
%s
这将失败。这给了我:香蕉香蕉开始(换行)1 2 3香蕉香蕉开始(换行)4 5 6香蕉。。。换句话说,它忽略了我的范围,只是忽略了我范围的最后一行。@wolfmason,嗯,你从哪里弄来的香蕉?它们从“不需要的信息”树上掉到我的文件中,因此我使用匹配范围来忽略它们。由于请求已更改,所以我给了这个减号。这使得对您的请求的所有回答都无效。我认为原意是隐含的,因为我使用的是匹配范围,而不是聪明的搜索&用regex或其他东西替换逻辑。对不起,换了。
awk '/start/ {f=1} f {s=s?s" "$0:$0} /stop/ {print s;f=s=0}' file
awk '{ORS = $1 == "stop" ? "\n" : " "; print}'
gawk '$1 ~ /^start$/{in_range = 1; ORS = " ";} $1 ~ /^stop/{in_range = 0; ORS = "\n"; print $0; next;} in_range{print $0}' test2.txt