Удалить строки из файла

Я делаю некоторую обработку текста в системе unix. У меня есть доступ к командной строке на этой машине, и на ней установлены Python, Perl и программы обработки текста по умолчанию, awk и т. д.

У меня есть текстовый файл, который выглядит следующим образом:

2029754527851451717 
2029754527851451717 
2029754527851451717 
2029754527851451717 
2029754527851451717 
2029754527851451717 1232453488239 Tue Mar  3 10:47:44 2009
2029754527851451717 1232453488302 Tue Mar  3 10:47:44 2009
2029754527851451717 1232453488365 Tue Mar  3 10:47:44 2009
2895635937120524206 
2895635937120524206 
2895635937120524206 
2895635937120524206 
2895635937120524206 
2895635937120524206 
5622983575622325494 1232453323986 Thu Feb 12 15:57:49 2009

В основном это 3 строки: ID ID Дата

Я хочу удалить все строки, в которых нет двух идентификаторов и даты. Таким образом, итоговые результаты будут такими:

2029754527851451717 1232453488239 Tue Mar  3 10:47:44 2009
2029754527851451717 1232453488302 Tue Mar  3 10:47:44 2009
2029754527851451717 1232453488365 Tue Mar  3 10:47:44 2009
5622983575622325494 1232453323986 Thu Feb 12 15:57:49 2009

Ребята, как бы вы предложили это сделать? Всего текстовый файл содержит около 30 000 строк.

Ваше здоровье

Эф


person RailsSon    schedule 27.04.2009    source источник


Ответы (5)


С awk:

awk 'NF > 2' input_file > output_file
person Martin Beckett    schedule 27.04.2009
comment
эквивалентный perl: perl -i -wane'print if @F › 6' input_file › output_file - person ysth; 27.04.2009

С Перлом:

perl -ne 'print if /^([0-9]+\s+){2}.+$/' $filename
person dsm    schedule 27.04.2009

Просто работаю над своим perl здесь, но это тоже может помочь:

perl -lane 'if (scalar(@F) == 3) { print @F;}' file >> file.out
person hyperboreean    schedule 27.04.2009
comment
разве это не должно быть scalar(@F) > 3 ? - person dsm; 28.04.2009

С Питоном:

file = open(filename, 'r')
lines = file.readlines()
file.close()

p = re.compile('^\d*$')

for line in lines:
    if not p.search(line): print line,
person kgiannakakis    schedule 27.04.2009
comment
Вы, вероятно, не хотите читать весь файл из 30000 строк. - person chills42; 27.04.2009
comment
@chills42: это мило. максимум 60 байт на строку дает 1,7 Мб. - person ysth; 27.04.2009

sed '/^[0-9]$/d'  filename

(возможно, придется изменить шаблон, если плохие строки имеют конечные пробелы). Вы также можете использовать команду grep -v, которая пропустит соответствующий шаблон.

person Steve B.    schedule 27.04.2009