Я ужасно испортил свой рабочий стол

Решение # 1: использование C

Самый быстрый способ: скомпилировать и запустить эту программу на C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_BUFFER_SIZE 1000000

int main(int argc, char *argv[]) {
    int length;

    if(argc == 3)
        length = atoi(argv[2]);
    else
        return 1;

    FILE *file = fopen(argv[1], "r");

    if(file != NULL) {
        char line[MAX_BUFFER_SIZE];

        while(fgets(line, sizeof line, file) != NULL) {
            char *pos;

            if((pos = strchr(line, '\n')) != NULL)
                *pos = '\0';
            if(strlen(line) >= length)
                printf("%s\n", line);
        }

        fclose(file);
    }
    else {
        perror(argv[1]);
        return 1;
    }

    return 0;
}

Скомпилировать с gcc program.c -o program, запустить с помощью ./program file line_length (где [ f8] = путь к файлу и line_length = минимальная длина строки в вашем случае 6, максимальная длина линии ограничена символами 1000000 на строку, вы можете изменить это, изменив значение MAX_BUFFER_SIZE) .

(Trick для замены \n на \0, найденного здесь.)

Сравнение со всеми другими решениями, предложенными для этого вопроса, кроме решения оболочки (тестовый прогон на ~ 91MB-файл с 10-миллиметровыми линиями со средней длиной 8 символов):

time ./foo file 6

real    0m1.592s
user    0m0.712s
sys 0m0.160s

time grep ...... file

real    0m1.945s
user    0m0.912s
sys 0m0.176s

time grep -E '^.{6,}$'

real    0m2.178s
user    0m1.124s
sys 0m0.152s

time awk 'length>=6' file

real    0m2.261s
user    0m1.228s
sys 0m0.160s

time perl -lne 'length>=6&&print' file

real    0m4.252s
user    0m3.220s
sys 0m0.164s

sed -r '/^.{,5}$/d' file >out

real    0m7.947s
user    0m7.064s
sys 0m0.120s

./script.py >out
real    0m8.154s
user    0m7.184s
sys 0m0.164s

Решение №2: использование AWK:

awk 'length>=6' file
length>=6: если length>=6 возвращает TRUE, печатает текущую запись.

Решение №3: использование Perl:

perl -lne 'length>=6&&print' file
length>=6: если length>=6 возвращает TRUE, печатает текущую запись.
% cat file
a
bb
ccc
dddd
eeeee
ffffff
ggggggg
% ./foo file 6
ffffff
ggggggg
% awk 'length>=6' file   
ffffff
ggggggg
% perl -lne 'length>=6&&print' file
ffffff
ggggggg
0
задан 18 September 2017 в 08:42

2 ответа

/var/log/apt/ будет иметь некоторые полезные записи о том, что было сделано, поэтому вы можете переустановить.

0
ответ дан 18 July 2018 в 06:39

/var/log/apt/ будет иметь некоторые полезные записи о том, что было сделано, поэтому вы можете переустановить.

0
ответ дан 24 July 2018 в 18:39

Другие вопросы по тегам:

Похожие вопросы: