如何用sed或awk删除文件每K行序列中的第m和第n行
问题需求
需要使用sed或awk工具,删除文件中每K行组成的序列(块)里的第m行和第n行。以K=9、m=3、n=7为例:每个9行的块内,删除该块的第3行和第7行,且不能通过匹配行内容实现(行内容可能任意)。
输入示例
文件input.txt内容:
Aline1 Aline2 Aline3 Aline4 Aline5 Aline6 Aline7 Aline8 Aline9 Bline1 Bline2 Bline3 Bline4 Bline5 Bline6 Bline7 Bline8 Bline9 ...
期望输出
Aline1 Aline2 Aline4 Aline5 Aline6 Aline8 Aline9 Bline1 Bline2 Bline4 Bline5 Bline6 Bline8 Bline9 ...
错误尝试
之前使用的命令逻辑错误,因为是基于全局行号的模运算,而非每个块内的相对行号:
awk '(NR)%3 && (NR)%7' input.txt
解决方案
方法1:使用awk实现
核心是计算每个块内的相对行号,判断是否为需要删除的行,保留其余行:
awk '((NR-1)%9 + 1) != 3 && ((NR-1)%9 + 1) !=7' input.txt
逻辑说明
(NR-1)%9:将全局行号NR转换为块内的偏移量(0~8)+1:偏移量转为块内的实际行号(1~9)- 条件判断:排除块内第3行和第7行,其余行输出
方法2:使用sed实现
直接定位每个块内需要删除的行(全局行号为m + t*K、n + t*K,t为0,1,2...):
sed -e '3~9d' -e '7~9d' input.txt
逻辑说明
3~9d:删除第3行,之后每间隔9行删除一次(对应每个块的第3行:3,12,21...)7~9d:删除第7行,之后每间隔9行删除一次(对应每个块的第7行:7,16,25...)-e:串联多个sed命令,依次执行
内容的提问来源于stack exchange,提问作者BabaYaga
相关产品推荐
相关产品推荐

