Найдите наименьший набор значений, где хотя бы одно значение присутствует в каждой строке файла

некоторые комментарии вместе с (как я надеюсь) полезным ответом.

Considerations

Machine specs

High End: Ищите последние дистрибутивы с легким окружением рабочего стола (показано далее)

Medium: Ищите более старые дистрибутивы, возможно, 1-2 летней давности, которые все еще поддерживаются.

Low End: Ищите barebone дистрибутивы с легким окружением рабочего стола

Что вам нужно

Было бы очень полезно узнать, что вы ищете. Может быть, linux-песочница? Машина для разработки? Тестовая машина?

Ваши варианты

Очень легкие дистрибутивы

Lubuntu: Само собой разумеется, основан на Ubuntu, использует LXDE для окружения рабочего стола, вы можете найти его на http://lubuntu.net/

Absolute Linux: Основан на Slackware, его основная направленность - возрождение старых машин. Идеально подходит для low end (только 32 бита). Размещен на http://www.absolutelinux.org/

Другие дистрибутивы

Следующий список следует воспринимать с долей соли. И запускать с легким окружением рабочего стола, таким как XFCE или LXDE.

Проверьте их сайты для получения дополнительной информации: XFCE | LXDE

Что касается дистрибутивов, то вот некоторые из самых популярных без какого-либо определенного порядка.

  • Ubuntu: Я слышал, как люди говорили: "Это Debian, сделанный правильным образом"
  • CentOS: Основан на RPM, это как свободный кузен Red Hat
  • Fedora: Основан на Red Hat, также широко популярен среди энтузиастов RPM
  • OpenSuse: Еще один дистрибутив, использующий RPM-репо, его называют одним из самых "Windows-подобных" дистрибутивов linux.

Я надеюсь, что эта информация поможет вам найти подходящий дистрибутив + подходящее окружение рабочего стола для вас.

3
12.10.2018, 15:07
2 ответа

Вот какой-то перл "строка -шумный":

perl -lane '
        for $f (@F) {push @{$x{$f}}, $.}                          # 1.
    } END {
        use List::Util qw/any first/;
        sub sort_by_count_desc {
            map  { $_->[0] } 
            sort { $b->[1] <=> $a->[1] || $a->[0] <=> $b->[0] } 
            map  { [$_, scalar(@{$x{$_}})] } 
            @_ 
        }
        @ordered = sort_by_count_desc(keys %x);                   # 2.
        %result = ();
        for ($i=1; $i<=$.; $i++) {                                # 3.
            $node = first { any {$_ == $i} @{$x{$_}} } @ordered;  # 4.
            $result{$node} = 1;
        }
        print join "\n", sort_by_count_desc(keys %result);
' df

Где

  1. перебирает строки файла и сопоставляет каждое значение со списком строк, в которых оно появляется
  2. создает упорядоченную строку значений, отсортированных по размеру списка явок по убыванию
  3. перебирает диапазон номеров строк и foreach номер строки
  4. находит первое значение, для которого появляется номер строки

Этот вывод

1
2
4
10
0
27.01.2020, 21:33

Это "тупая" Linux оптимизация с использованием bash, но она не особенно переносима и не улучшает алгоритм:

f=$(mktemp) ; cp df $f
while [ -s $f ]  ; do   
    tr '\t' '\n' < $f | sort | uniq -c | sort -r -k1,1 -k2,2n | 
    grep -om1 '\S$' | tee >(grep -vwf - $f | sponge $f)
done
rm $f

Примечания:

  • Использование входного файла df в качестве блокнота является плохой практикой, вместо этого используйте mktemp.

  • Вывод поступает на STDOUT . При необходимости измените doneна done > out.

  • Утилитаspongeустраняет необходимость называть файл tmpdf .

  • Использует teeи grep -f -вместо строковой переменной поиска $i.

  • Проверка того, что wc -lравно 0 , не требуется; test -sдостаточно.

0
27.01.2020, 21:33

Теги

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