我正在尝试使用 sed 检索 2 行文本,每 10 行(10、11、20、21、30、31,...)。
对于第 10 行和第 11 行,我可以使用sed -n '10,11p' file
or sed -n '10,+1p' file
。对于范围 (第 10, 20, 30, ...) sed -n '10,~10p' file
。但有可能以某种方式将两者结合起来吗?
sed -n '10,~10,+1p' file
不管用。
我认为这是重复的,但我找不到任何参考。谢谢!
答案1
ADDR1,ADDR2
将与FIRST~STEP
asADDR1
和+OFFSET
as 一起使用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
FNR
是awk
s 自动更新每个文件的行计数器- “规则块”(
{ ... }
) 之外的任何计算结果为“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