如何为每 m 行获取 n 行(n

如何为每 m 行获取 n 行(n

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

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

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

答案1

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

sed -n '1~4p;2~4p'

其中显示“每 4 行打印第一行,每 4 行打印第二行”或“从第 1 行开始,每第 4 行打印一次,从第 2 行开始,每第 4 行打印一次”。

答案2

gnu split

n=2
m=4 
split -l ${m} --filter="head -n ${n}" infile

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

n=2
m=4 
i=7
{ sed ${i}q >/dev/null; split -l ${m} --filter="head -n ${n}"; } <infile

如果您无法gnu使用可以使用的工具awk

awk -v n=2 -v m=4 -v i=7 'NR<=i{next}; (NR-i)%m==1{c=1}; c++<=n' infile

答案3

对于 GNU sed

sed '3~4,+1 d' file

或更一般:

m=4
n=2
sed "$((m-n+1))~$m,+$((m-n-1)) d" file

答案4

这是一个可移植且非常简单的解决方案sed。它不使用~许多其他答案所使用的非便携式。缺点是您需要sed根据以下内容编写代码n,你无法轻易通过n作为参数。在实践中,该解决方案适用于n提前知道并且很小。

为了a=5,米=4,n=2

sed -n '5,$ {p;n;p;n;n;}'

在哪里

  • 5简单来说就是A
  • p;n;pp命令是否重复n次,n其间有命令(一般:p;n;p;n;…;p;n;p);
  • n;nn命令是否重复次(一般:n;n;n;…;n)。

输出示例:

$ seq 1 13 | sed -n '5,$ {p;n;p;n;n;}'
5
6
9
10
13

如果您需要大型便携式解决方案或为了或者n事先不知道,那么你应该使用awk,我想。

相关内容