如何保留文件中每个整数起始块的前4行?Sed尝试失败求助
嘿,我明白你要处理的是那种分块的文本文件——每个块以整数开头,后面跟着小数行,想保留每个块的前4行对吧?之前用sed没搞定,没关系,我给你两个靠谱的方案,其中用awk的方法最直观好懂,先看这个:
方案1:用awk处理(首推)
awk天生适合处理这种按“块”划分的文本,我们可以用一个计数器来跟踪每个块的行数:
awk '/^[0-9]+$/ {n=1} n<=4 {print; n++}' your_file.txt
简单解释下逻辑:
- 当遇到以整数开头的行(
/^[0-9]+$/这个正则匹配),就把计数器n重置为1,代表新块的第一行 - 只要计数器
n小于等于4,就打印当前行,然后把n加1——这样每个块最多只会输出前4行(包括开头的整数行)
方案2:用sed实现
如果你坚持想用sed,也可以通过它的分支跳转功能实现,不过逻辑稍微绕一点:
sed -n '/^[0-9]\+$/{:a;N;s/\n/&/3;Ta;p;d}' your_file.txt
逻辑拆解:
-n让sed默认不输出任何内容,只打印我们指定的部分- 匹配到整数开头的行后,进入块处理流程:
:a定义一个跳转标签aN读取下一行到当前的模式空间(把多行攒在一起)s/\n/&/3检查模式空间里的换行符数量:如果已经有3个换行符,说明已经攒够了4行(首行+3行后续)Ta如果上面的替换操作失败(也就是换行符不够3个,行数没到4),就跳回标签a继续读取下一行- 当攒够4行后,
p打印这4行,d清空模式空间,准备处理下一个块
测试示例
假设你的文件内容是这样的:
100 0.123 0.456 0.789 0.abc 0.def 200 1.111 2.222 3.333 4.444 5.555
运行上面的命令后,输出会是:
100 0.123 0.456 0.789 200 1.111 2.222 3.333
内容的提问来源于stack exchange,提问作者alloppp
相关产品推荐
相关产品推荐

