如何在命令行中为每 m 行(n<m)获取 n 行?

cof*_*fee 7 sed text-processing

是否有一种非常简单的方法(也许使用一行 sed?)来获取每一行的n行,从这块行中的 ath 行开始?nm

更具体地说,我有一个包含数百万行的文件。对于每 4 行,我想获得前两行。

但我想我也想知道在其他类似情况下这样做。这就是为什么我在这里问了一个更一般的问题。

cho*_*oba 15

您可以~在 GNU sed 中的地址中使用:

sed -n '1~4p;2~4p'
Run Code Online (Sandbox Code Playgroud)

其内容为“每 4 行打印第一行,每 4 行打印第二行”或“从第 1 行开始,每 4 行打印一次,从第 2 行开始,每 4 行打印一次”。


don*_*sti 12

与gnu split:

n=2
m=4 
split -l ${m} --filter="head -n ${n}" infile
Run Code Online (Sandbox Code Playgroud)

如果您只想在i第 th 行之后执行此操作,只需将前几行重定向到/dev/null:

n=2
m=4 
i=7
{ head -n ${i} >/dev/null; split -l ${m} --filter="head -n ${n}"; } <infile
Run Code Online (Sandbox Code Playgroud)

如果您无法使用gnu工具,则可以使用awk:

awk -vn=2 -vm=4 -vi=7 'NR<=i{next}; (NR-i)%m==1{c=1}; c++<=n' infile
Run Code Online (Sandbox Code Playgroud)

  • 更简单的 awk:`'NR&lt;=i{next} c++%m&lt;n'` (2认同)

Cos*_*tas 5

对于 GNU sed

sed '3~4,+1 d' file
Run Code Online (Sandbox Code Playgroud)

或更一般的:

m=4
n=2
sed "$((m-n+1))~$m,+$((m-n-1)) d" file
Run Code Online (Sandbox Code Playgroud)