取第一个和最后一个字段
本帖最后由 unix520 于 2023-08-23 16:15 编辑a.txt
#
n楼.
n楼..
n楼+
n楼..&楼...
n层#
n层....
Sorry 再补充一下多一些栗子
n顶#
n楼.+
n楼.++
n楼+..
n楼..&楼...++
n层#+
n层....+
awk '/楼|层/' a 这似乎会输出匹配到字段
如何能取到第一个 匹配的字段 "楼"和最后一个匹配字段"层"
b.txt
n楼.
n层....
n楼.+
n层....+
# cat a
层#
楼..
楼.
楼+
楼..&楼...
层#
层....
# awk 'BEGIN{found=0} /楼/{if(found==0){print $0; found=1}} /层/{lastLine=$0} END{if(lastLine!=""){print lastLine}}' a
楼..
层.... 本帖最后由 unix520 于 2023-08-23 16:16 编辑
回复 2# baby_神
Thanhs
Sorry大佬 我在顶楼补充多一些行
如果文本中有很多这样的行, 不是只要仅2行需要按这规律输出所有这些行,
perl -00nE'say/(^楼\N*\R)\X+(^层\N*\R)/mg' file
想用awk的话,照着这思路改一下也行,或者用临时变量计数法之类的都可以,建议你给出的例子不要把“层”放每段的最后一行,如果每一段的最后不一定就是你想要的内容的话。
你这样的文本样例,别人也可以只找第一个“楼”开头的行,然后再打印每段最后一行,你确定这样是你想要的吗? 本帖最后由 unix520 于 2023-08-18 16:46 编辑
回复 4# legs
如果匹配字段前后有字符或空格不行
本帖最后由 unix520 于 2023-08-18 16:47 编辑
回复 4# legs
perl -0nE'say$1,$+while/(^\N+楼\N+\n)((?!楼\N*\n).)*(^\N+层\N+\n)/msg' file
我用的就是你以前写的代码,很正确 只不过他是取后一个, 而不是第一个 但现在需要取第一个,我改不好不会prel
本帖最后由 unix520 于 2023-08-18 16:41 编辑
Sorry发多了 不知道你解决了,我试了一下,没有问题:
awk 'BEGIN{x=0;buffer=""}{if(substr($0,1,3)=="楼" && x==0){print $0;x=1}}{if($0=="" && buffer!=""){print buffer;print $0;x=0}}{buffer=$0} END{if($0!=""){print $0}}' 1.log 不知道你解决了没有,我试了一下,没有问题,share给你:
awk 'BEGIN{x=0;buffer=""}{if(substr($0,1,3)=="楼" && x==0){print $0;x=1}}{if($0=="" && buffer!=""){print buffer;print $0;x=0}}{buffer=$0} END{if($0!=""){print $0}}' 1.log 不知道你解决了没有,I tried it with no problem, share with you:
awk 'BEGIN{x=0;buffer=""}{if(substr($0,1,3)=="楼" && x==0){print $0;x=1}}{if($0=="" && buffer!=""){print buffer;print $0;x=0}}{buffer=$0} END{if($0!=""){print $0}}' 1.log