Как игнорировать буквы с помощью сортировки чисел

Думаю, это мера предосторожности. Непривилегированным пользователям не разрешается применять ограничения к таким программам, как sudo, которые установлены -пользователь -идентификатор (или имеют установленные права доступа к файлам ), в случае, если это сбивает их с толку при выполнении действий, которые они не намеревались выполнять. разрешать.

В некоторых случаях это обеспечивается путем предотвращения повышения прав с помощью набора -uid и т. д. Такой подход применяется при фильтрации системных вызовов с помощью seccomp.

Тем не менее, для пространств имен намерение состояло в том, чтобы разрешить использование идентификаторов пользователей в пространствах имен. Пространства имен были объединены в основной Linux в ходе поэтапного процесса, начиная с самых простых и заканчивая пространствами имен пользователей. Я подозреваю, что было мало интереса к добавлению особого случая, чтобы не применять -новых -привилегий при входе в пространство имен PID, когда у вас еще нет полных привилегий.

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

2
14.09.2020, 19:21
5 ответов

Применение опции-V(естественная сортировка )и сортировка по первому полю

sort -Vk1,1 file

name name space 2018
name1 name1 space (c. 2019)
name2 name2 space (active 2020)

Для некоторых сложных случаев:

sort -Vk1,1 -k5 file

После комментариев решил добавить:

awk 'BEGIN {PROCINFO["sorted_in"]="@val_num_asc"} {a=$0; gsub(/[^0-9]/, ""); D[a]=$0}; END {for(i in D)print i}' file

Перевожу все числа в значения массива с ключами в виде строки и указываю порядок сортировки :PROCINFO["sorted_in"]="@val_num_asc"

2
18.03.2021, 23:05

Чтобы отсортировать справа -большую последовательность десятичных цифр в каждой строке, вы можете извлечь ее и поместить в начало, затем отсортировать и удалить:

<file LC_ALL=C sed '
  h;                    # save pattern space (current line) onto hold space
  s/[^0123456789]*$//;  # remove non-digit characters from the end
  s/^.*[^0123456789]//; # remove everything up to the last non-digit
  G;                    # append \n and hold space to pattern space
  s/\n/:/;              # replace that \n with :' |
  sort -n |
  cut -d: -f2-
3
18.03.2021, 23:05

команда

awk '{sub(/)$/,"",$0);print }' filename|sort -k5| awk 'NR>1{$0=$0")"}1'

выход

name name space 2018
name1 name1 space (c. 2019)
name2 name2 space (active 2020)
0
18.03.2021, 23:05

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

Фрагмент кода:

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Input data file $FILE:"
head $FILE

pl " Results, msort:"
msort -l -j -q -n -1 --comparison-type hybrid $FILE

производит:

-----
 Input data file data1:
name name space 2018
name2 name2 space (active 2020)
name0 xx2021yy
name1 name1 space (c. 2019)

-----
 Results, msort:

 name name space 2018
 name1 name1 space (c. 2019)
 name2 name2 space (active 2020)
 name0 xx2021yy

Кратко :опустить журнал, тишина, каждая строка представляет собой запись, сортировка по правому -самому полю, гибридное сравнение.

Запустить:

Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 3.16.0-10-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
bash GNU bash 4.3.30

Из справочной страницы:

   -n,--position <POS>(,<POS>)
          Sort on the specified POS or contiguous range of POSs,  where  a
          POS  is  of  the  form <field number>(.<character number>). Both
          counts begin at one.  Field numbers but  not  character  numbers
          may  be negative, in which case they are counted from the right.
          Thus, 1.2 is the second character of the first  field;  -2.1  is
          the first character of the next to last field.

Код msort можно найти во многих репозиториях, здесь подробнее:

msort   sort records in complex ways (man)
Path    : /usr/bin/msort
Version : 8.53
Type    : ELF 64-bit LSB executable, x86-64, version 1 (SYS...)
Help    : probably available with -h,--help
Repo    : Debian 8.11 (jessie) 
Home    : http://www.billposer.org/Software/msort.html (pm)

С наилучшими пожеланиями... ура, дрл

1
18.03.2021, 23:05

с использованием Raku (, ранее известного как Perl 6)

Это труднее, чем кажется. Я начал с того, что удвоил количество строк в тестовом файле, а затем подумал о том, как лучше всего решить эту проблему. Один из подходов может заключаться в разделении по пробелам, однако он также будет разделен по пробелам в круглых скобках, поэтому некоторые строки будут иметь 4 столбца, а другие - пять.

Приведенный ниже код сортируется по регулярному выражению «год» из 4 -цифр, игнорируя столбцы (, то есть «текстовые поля», на языке OP ). Код работает, пока есть только один (1 )год -на -строку:

raku -e 'my $a = lines(); my @b = $a.comb(/ \d**4 /).pairs; my $c = @b.sort(*.values)>>.keys.flat; $a[$c.flat]>>.put;' sort_year.txt
name name space 2018
name0 name space 2018
name1 name1 space (c. 2019)
name4 name1 space (c. 2019)
name2 name2 space (active 2020)
name3 name2 space (active 2020)

Приведенный выше код комбинирует 4-значный шаблон регулярного выражения -(@b); индекс упорядочения($c)получается (из @b), а затем строки($a)переупорядочиваются на основе "ключа" индексации ($c).

Вот входной файл для тех, кто хочет попробовать это дома:

~$ cat sort_year.txt

name name space 2018
name2 name2 space (active 2020)
name1 name1 space (c. 2019)
name0 name space 2018
name3 name2 space (active 2020)
name4 name1 space (c. 2019)

https://raku.org/

1
18.03.2021, 23:05

Теги

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