我有一个大文件,我想打印每个连续的 50 行,15号和25日线。
sed -n '15,25p' inputfile
如何修改此命令以仅打印第 15 行和第 25 行并循环遍历文件中的每 50 行。
答案1
awk 'NR % 50 == 15 || NR % 50 == 25'
将是明显的便携式方式。
请注意 GNUsed
替代方案:
sed '15~50b;25~50b;d'
使用 any sed
,您始终可以执行以下操作:
sed -n 'n;n;n;n;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n'
(获取下一行 14 次,打印下一行 10 次,打印下一行 25 次,返回到下一个循环(抓住缺失的额外行以生成 50 次))。
答案2
这是一份工作awk
awk '(NR%50==15) || (NR%50==25)' inputfile
编辑:我被OP中的sed指令误导了。
答案3
和perl
1)与解决方案类似awk
,$.
变量存储行号
$ seq 135 | perl -ne 'print if $.%50==15 || $.%50==25'
15
25
65
75
115
125
2)对照行号列表,更容易扩展
$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25)'
15
25
65
75
115
125
$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25,32)'
15
25
32
65
75
82
115
125
132
答案4
另一种使用 awk 的方法基于桑迪普的想法使用列表的方法:
awk 'BEGIN { a[15] a[25] }; NR % 50 in a'
a
根据要打印的行设置数组中的键。打印与NR % 50
数组中的键之一匹配的行。
为了给出一些性能指标,我对这种方法进行了计时,并与其他答案进行了比较,取user
3 次运行时间的平均值。
0.276秒
$ time awk 'BEGIN { a[15] a[25] }; NR % 50 in a' <(seq 1000000) > /dev/null
0.374秒
$ time awk 'NR % 50 == 15 || NR % 50 == 25' <(seq 1000000) > /dev/null
0.384秒
$ time perl -ne 'print if $.%50==15 || $.%50==25' <(seq 1000000) > /dev/null
0.542秒
$ time perl -ne 'print if grep {$_==$.%50} (15,25)' <(seq 1000000) > /dev/null