Трубопровод, проходящий параллельно через создание нескольких подстативов

Попробовав все, ни одно из которых не имело никакого значения, я наконец понял, что мне нужно отключить fastboot в моем BIOS. В моем случае это было:

BIOS fastboot setting

Изменение этого параметра с «Минимальный» на «Полностью» позволило мне перейти прямо к загрузчику без необходимости нажимать F12 .

0
31.10.2018, 12:10
5 ответов

Следующее не сортирует данные по столбцам, а просто извлекает уникальные значения. Неясно, нужна ли сортировка.

Использованиеawk:

$ awk '{ n=split($0,a,FS); $0=""; j=1; delete u; for (i=1; i<=n; i++) if (!u[a[i]]++) $(j++) = a[i]; print }' <file
1 2 5
1 5 3
1 5
5 2
2 4 3

Программа, красиво оформленная, с комментариями:

{
    # split the current record into fields in the array a
    n = split($0, a, FS)

    # empty the current record
    $0=""

    # j is the next field number that we are to set
    # in the record that we are building
    j=1

    # seen is an associative array that we use to
    # keep track of whether we've seen a bit of
    # data before from this record
    delete seen

    # loop over the entries in a (the original
    # fields of the input data)
    for (i=1; i<=n; i++)
        # if we haven't seen this data before,
        # mark it as seen and...
        if (!seen[a[i]]++)
            # add it to the j:th field in the new record
            $(j++) = a[i]

    print
}

Идея, которую я использовал здесь, состоит в том, чтобы создать выходную запись с уникальными полями из исходных данных для каждой строки ввода.

«Запись» по умолчанию является синонимом «линии».а «поле» является синонимом «столбца» (. Это просто более общие слова, которые зависят от текущих значений в RSи FS).

2
28.01.2020, 02:13

Поскольку сортировать строки проще, чем сортировать столбцы в строке, один из подходов может состоять в том, чтобы транспонировать каждую строку (, чтобы каждое поле стало строкой ), применить sortи uniq, а затем переставить их обратно..

Вот наивная реализация с использованием инструментов GNU:

$ while read -r line; do echo "$line" | grep -o '[^ ]*' | sort -h | uniq | paste -s; done <file

Он перебирает fileи для каждой строки:

  • grepс опцией -o(печатать только совпадающую часть каждой строки )разбивает ввод на n строк, по одной для каждой совпадающей подстроки. Здесь мы сопоставляем все, кроме пробелов.
  • Разделенные строки сортируются с помощью параметра -h, который сравнивает числа, понятные человеку. (Если вы хотите отсортировать поля как буквенно-цифровые строки, удалите-h).
  • Команда uniqудаляет дубликаты.
  • paste -sпечатает каждую строку из стандартного ввода как поля одной строки, разделенные табуляцией. Вы можете добавить окончательный | tr '\t' ' ', чтобы заменить вкладки на пробелы.

Обратите внимание, однако, что использование циклов для обработки текста обычно считается плохой практикой .

5
28.01.2020, 02:13

С Perl:

perl -MList::Util=uniq -alne 'print join " ", sort { $a <=> $b } uniq @F' file
1 2 5
1 3 5
1 5
2 5
2 3 4
2
28.01.2020, 02:13

Попробуйте этот awkподход к сортировке и унификации:

awk '
        {MX = 0                                                 # reset MAX
         split ("", C)                                          # reset C array
         for (i=1; i<=NF; i++)  {C[$i]++                        # for each number encountered, set C element to "true"
                                 if ($i > MX) MX = $i           # record MAX for this line
                                }
         for (i=1; i<=MX; i++) if (C[i]) printf "%s ", i        # only print the index of elements being "true", sorted
         printf ORS                                             # print end-of-line
        }
' file
1 2 5 
1 3 5 
1 5 
2 5 
2 3 4 
0
28.01.2020, 02:13

Другой bashподход, похожий на подход @fra -san.

while read X;do tr<<<$X ' ' \\n|sort -u|paste -sd" ";done<file
1 2 5
1 3 5
1 5
2 5
2 3 4
0
28.01.2020, 02:13

Теги

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