如何打印每 50 行中的第 15 行和第 25 行?

如何打印每 50 行中的第 15 行和第 25 行?

我有一个大文件,我想打印每个连续的 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数组中的键之一匹配的行。


为了给出一些性能指标,我对这种方法进行了计时,并与其他答案进行了比较,取user3 次运行时间的平均值。

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

相关内容