sed 与下一行(`+N` 选项)和频率(`~N`)一起

man*_*ius 4 sed awk text-processing

我试图用 sed 检索 2 行文本,每 10 行(10、11、20、21、30、31,...)。

对于第 10 行和第 11 行,我可以使用sed -n '10,11p' filesed -n '10,+1p' file。而对于范围 (lines 10, 20, 30, ...) sed -n '10,~10p' file。但是有可能以某种方式将两者结合起来吗?

sed -n '10,~10,+1p' file 不管用。

我认为这是重复的,但我找不到任何参考。谢谢!

Sté*_*las 10

使用ADDR1,ADDR2with FIRST~STEPasADDR1+OFFSETas ADDR2,所以:

$ seq 30 | sed '10~10,+1!d'
10
11
20
21
30
Run Code Online (Sandbox Code Playgroud)

无论如何,请注意~+都是非标准的 GNU 扩展。

有关详细信息,请参阅GNU 系统上的info sed 'line selection'info sed 'range of lines'

POSIXly,你会使用:

seq 30 | sed -n '1n;n;n;n;n;n;n;n;n;p;n;p'
Run Code Online (Sandbox Code Playgroud)


Adm*_*Bee 7

怎么 awk解决?

awk '(FNR>1) && (FNR%10<2)' file
Run Code Online (Sandbox Code Playgroud)
  • FNRawks 自动更新每个文件的行计数器
  • “规则块” ( { ... })之外的任何计算结果为“真”(无论是 string 1)的条件都将指示awk打印当前行,包括迄今为止所做的所有修改。
  • 因此,(FNR>1) && (FNR%10<2)将打印当前行,如果它不是第一行,并且行号是 10 的整数倍(或最多从这样的倍数增加 1)。这相当于“每 10 行和以下行”。