我有一个巨大的文本文件,我需要抓住每n,n+1行在一个单独的文件。我遇到了sed命令,但它只能帮助我从文本文件中抓取每第n行。例如:
**
$ sed -n '0~4p' somefile** **```** Any suggestions on grabbing n+1th line at the same time? **
$ sed -n '0~4p'某个文件***"'**
k5hmc34c1#
这可能对你有用(GNU sed):
sed -n '4~4,+1p' file
这将从第4行开始打印第4加1行。
dvtswwa32#
下面是一个可能的解决方案(假设这是所需的输出):
$ seq 20 | sed -n '0~4{N;p}' 4 5 8 9 12 13 16 17
根据N命令的手册:在模式空间中添加一个新行,然后将下一行输入附加到模式空间中。如果没有更多的输入,sed将退出,不处理任何命令。当使用-z时,一个零字节(ascii 'NUL'字符)将被添加到行之间(而不是新行)。如果20的输出也应该为上述输入的一部分,则可以用途:
N
20
seq 20 | sed -n '0~4{p;n;p}' # alternative solution if ~ address range isn't supported seq 20 | sed -n '1b; n;n;p;n;p'
bvhaajcl3#
sed的~选项是非标准的,但可以用来做你想做的事情。但使用awk似乎更自然:
sed
~
awk
awk 'NR>1 && NR % n < 2' n=5
(eg):
$ yes | nl | sed 20q | awk 'NR>1 && NR % n < 2' n=5 5 y 6 y 10 y 11 y 15 y 16 y 20 y
3条答案
按热度按时间k5hmc34c1#
这可能对你有用(GNU sed):
这将从第4行开始打印第4加1行。
dvtswwa32#
下面是一个可能的解决方案(假设这是所需的输出):
根据
N
命令的手册:在模式空间中添加一个新行,然后将下一行输入附加到模式空间中。如果没有更多的输入,sed将退出,不处理任何命令。当使用-z时,一个零字节(ascii 'NUL'字符)将被添加到行之间(而不是新行)。
如果
20
的输出也应该为上述输入的一部分,则可以用途:bvhaajcl3#
sed
的~
选项是非标准的,但可以用来做你想做的事情。但使用awk
似乎更自然:(eg):