如何删除包含少于n个项目的所有行

时间:2011-04-04 18:52:30

标签: vim sed awk vi

我想删除所有包含少于 n 项目的行,空格分隔。

假设我要删除包含少于3个项目的行。所以下面的文件:

sdf sdfsdf sdfgsdf sdfsdfsd
sdf sdfsdf 
sdf sdfsdf sdfgsdf 
sdf sdfsdf sdfgsdf  ertert

应该导致:

sdf sdfsdf sdfgsdf sdfsdfsd
sdf sdfsdf sdfgsdf 
sdf sdfsdf sdfgsdf  ertert

实际上,awksed解决方案均可接受。

6 个答案:

答案 0 :(得分:11)

这个怎么样:

awk 'NF >= 3' filename

答案 1 :(得分:3)

在vim中:

:v/\(\S\+\s\+\)\{3,}/d

另一种选择是

:g/./exec len(split(getline('.'))) < 3 ? 'd' : ''

你也可以做一些有趣的事情,比如

:py vim.current.buffer[:] = [l for l in vim.current.buffer if len(l.split()) >= 3]

答案 2 :(得分:2)

我知道你要求提供vi解决方案,但在perl中这简直太简单了:

ethan@rover:~$ perl -ne 'print if split > 3' foo

其中“foo”是您的文件。

答案 3 :(得分:2)

由于有vim标签:

:v/\(\S\+\s\)\{2,}\S/d

将2替换为n-1。

答案 4 :(得分:1)

NF是记录中的字段数。将2替换为您想要的数字

awk '{if (NF > 2) print $0}' inputFile.txt

答案 5 :(得分:1)

~$ cat test.txt | awk '{if(length($3) > 0) print $0;}'

希望这有帮助