有没有一种非常简单的方法(也许使用 sed 的一行?)来获取每一行n
的行,从这行块中的 ath 行开始?n
m
更具体地说,我有一个包含数百万行的文件。对于每 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;p
p
命令是否重复n次,n
其间有命令(一般:p;n;p;n;…;p;n;p
);n;n
n
命令是否重复锰次(一般:n;n;n;…;n
)。
输出示例:
$ seq 1 13 | sed -n '5,$ {p;n;p;n;n;}'
5
6
9
10
13
如果您需要大型便携式解决方案米或为了米或者n事先不知道,那么你应该使用awk
,我想。