如何在文件中输出围绕特定已知行号(例如5)的N行(例如2)行?
cat >/tmp/file <<EOL
foo
bar
baz
qux
quux
EOL
# some command预期产出:
bar
baz
qux发布于 2022-04-12 10:03:33
如果预先知道行数和行数,并且能够计算第一行的数目和最后一行的行数,则可以使用简单的GNU sed命令。
sed -n '3,7p' file.txt将输出file.txt的第3、4、5、6和7行。
如果您想更改行号,那么我将按照下面的方式使用GNU AWK
awk 'BEGIN{n=5}NR==n-2,NR==n+2' file.txt说明:我将n设为5,然后使用范围从n-2第四行(包含)到n+2第四行(包括)选择行,不提供相当于给予{print}的动作。
发布于 2022-04-12 12:11:26
稳健、可移植和高效地打印上下文(目标线两侧的行数相同):
$ awk -v tgt=5 -v ctx=2 '
BEGIN{beg=tgt-(ctx=="" ? bef : ctx); end=tgt+(ctx=="" ? aft : ctx)}
NR==beg{f=1} f; NR==end{exit}
' file
bar
baz
qux或目标行之前和之后的不同行数:
$ awk -v tgt=5 -v bef=2 -v aft=4 '
BEGIN{beg=tgt-(ctx=="" ? bef : ctx); end=tgt+(ctx=="" ? aft : ctx)}
NR==beg{f=1} f; NR==end{exit}
' file
bar
baz
qux
quux特别是关于效率问题的说明:
NR==end{exit},而不是NR==end{f=0}或类似的,所以awk不会浪费时间,在打印所需的行之后不必要地读取输入文件的其余部分。发布于 2022-04-12 09:40:20
没有行号前缀:
awk -v nr=5 'FNR>=nr-2 && FNR<=nr+3{ print $0 }' /tmp/filebar
baz
qux带有行号前缀:
awk -v nr=5 'FNR>=nr-2 && FNR<=nr+3{ print FNR":"$0 }' /tmp/file3:bar
4:
5:baz
6:
7:quxhttps://stackoverflow.com/questions/71840390
复制相似问题