как удалить все строки, содержащие менее n элементов - PullRequest
2 голосов
/ 04 апреля 2011

Я хочу удалить все строки, содержащие менее 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

На самом деле приемлемы оба решения: awk и sed

Ответы [ 6 ]

11 голосов
/ 04 апреля 2011

Как насчет этого:

awk 'NF >= 3' filename
3 голосов
/ 04 апреля 2011

В 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 голосов
/ 05 апреля 2011

Поскольку существует тег vim:

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

Замените 2 на n-1.

2 голосов
/ 04 апреля 2011

Я знаю, что вы просили решение для vi, но это так просто в perl:

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

где "foo" - ваш файл.

1 голос
/ 04 апреля 2011
~$ cat test.txt | awk '{if(length($3) > 0) print $0;}'

Надеюсь, это поможет

1 голос
/ 04 апреля 2011

NF - количество полей в записи.Замените 2 на номер, который вы хотите

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