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

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

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

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

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

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

答案1

ADDR1,ADDR2将与FIRST~STEPasADDR1+OFFSETas 一起使用ADDR2,因此:

$ seq 30 | sed '10~10,+1!d'
10
11
20
21
30

无论如何,请注意~+都是非标准 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'

答案2

有什么解决 awk办法吗?

awk '(FNR>1) && (FNR%10<2)' file
  • FNRawks 自动更新每个文件的行计数器
  • “规则块”( { ... }) 之外的任何计算结果为“true”(并且可以是字符串1)的条件都将指示awk打印当前行,包括迄今为止所做的所有修改。
  • 因此,(FNR>1) && (FNR%10<2)如果当前行不是第一行,并且行号是 10 的整数倍(或最多 +1),则将打印当前行。这相当于“每 10 行及以下”。

答案3

使用 awk 我们可以如图所示执行。 NR 是 awk 术语中的行号。

$ awk 'NR ~ /.[10]$/'  file

我们sed可以如下所示执行,增加保留空间,直到达到 10 个换行符。

$ sed -nE 'x
  /\n{9}/{
    z;x;$d
    N;p;D
  }
  s/$/\n/;h
' file
$ perl -ne '$.%10||print($_.<>)' file

相关内容