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


9

我有一个大文件,我想从连续的50行,第15行和第25行打印。

sed -n '15,25p' inputfile

如何修改此命令以仅打印第15和25行并在文件中的每50行上循环。

Answers:


22
awk 'NR % 50 == 15 || NR % 50 == 25'

将是显而易见的可移植方式。

注意一个GNU sed替代方案:

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))。


10

这是一份工作 awk

awk '(NR%50==15) || (NR%50==25)' inputfile

编辑:我被OP中的sed指令误导了。


9

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的另一种方法是基于Sundeep的使用列表的思想

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.