如何在Solaris 10的KSH中按重复模式打印长文件指定行?
在Solaris 10 KSH中用nawk/sed实现周期性行筛选
针对你需要从长文件中重复打印第1、2、3、4、7行,跳过5、6、8、9行直到文件末尾的需求,这里提供两种适配Solaris 10环境的实现方案:
1. nawk方案(推荐,逻辑更清晰)
利用nawk的行号变量NR,通过对9取模来判断当前行是否处于需要保留的位置。我们把每9行作为一个周期,需要保留的行在周期内的位置是第1、2、3、4、7位,对应的模运算实现如下:
nawk '((NR - 1) % 9) ~ /^[01236]$/' your_input_file.txt
原理说明:
(NR - 1) % 9将行号转换为0-8的周期索引(第1行→0,第2行→1,…,第7行→6,第9行→8)- 索引为0、1、2、3、6对应的正是我们需要保留的行,通过正则匹配筛选这些行并打印
如果你偏好更直白的条件判断,也可以用这种写法,可读性更强:
nawk '((NR-1)%9 == 0) || ((NR-1)%9 == 1) || ((NR-1)%9 == 2) || ((NR-1)%9 == 3) || ((NR-1)%9 == 6)' your_input_file.txt
2. sed方案(适配Solaris 10原生sed)
Solaris 10的原生sed不支持GNU sed的~步长语法,所以我们用基础的p(打印)和n(读入下一行)命令来模拟周期筛选:
sed -n 'p;n;p;n;p;n;p;n;n;n;p;n;n' your_input_file.txt
原理说明:
这个命令的执行流程对应每9行的处理逻辑:
p→ 打印第1行;n→ 跳至第2行p→ 打印第2行;n→ 跳至第3行p→ 打印第3行;n→ 跳至第4行p→ 打印第4行;n→ 跳至第5行n→ 跳至第6行;n→ 跳至第7行p→ 打印第7行;n→ 跳至第8行n→ 跳至第9行;此时进入下一个周期,从第10行重复上述操作
即使文件末尾不足9行,这个命令也会正确处理剩余的行(比如最后只剩3行,会正常打印这3行)。
内容的提问来源于stack exchange,提问作者ayrton_senna
相关产品推荐
相关产品推荐

