Проблемы сортировки в Linux

Почему вы этого ожидали?

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

Утилита setfacl распознает следующий ACL форматы ввода (для ясности вставлены пробелы):

[d [efault]:] [u [ser]:] uid [: perms]
Разрешения указанного пользователя. Разрешения владельца файла, если uid пуст.

[d [efault]:] g [roup]: gid [: perms]
Разрешения указанной группы. Разрешения группы-владельца, если gid пуст.

[d [efault]:] m [ask] [:] [: perms]
Маска действующих прав

{{1} }

[d [efault]:] o [ther] [:] [: perms]
Разрешения других лиц.

ACL отделены от традиционных элементов управления доступом Unix - владельца, группы и маски прав для владельца, группы и других.

Хотя мы не можем придумать ни одной причины, по которой вам может понадобиться ACL с тем же пользователем или группой, что и традиционные средства управления доступом, решение о том, что это должно быть запрещено, не входит в философию Unix. setfacl с радостью позволяет вам это делать; KISS хорош.

Если вам не нравится такое поведение, и вы бы предпочли, чтобы утилита «автоматически определяла» эту ситуацию, вы можете написать свою собственную оболочку вокруг setfacl . В сценарии оболочки вы можете использовать stat -c% U FILE для получения имени владельца и stat -c% G FILE для имени группы файла или каталога. ФАЙЛ . По моему опыту, в организациях со сложным набором пользователей и групп такие оболочки - не только для setfacl , но и для всего управления владением файлами - повсеместны.

2
07.03.2017, 15:18
2 ответа

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

Cyb5    157.426  -> Cyb5157426
Cyb561  0.425933 -> Cyb5610425933

vs

Cyb561  7.11003 -> Cyb561711003
Cyb5    64.074  -> Cyb564074

Чтобы отсортировать только первый столбец, вам нужно использовать следующую команду:

sort -d -k1,1
2
27.01.2020, 21:53

Cyb5 157.426 сортирует до Cyb561 0.425933 , а Cyb5 64.074 сортирует после Cyb561 7.11003 , потому что в вашем языковом стандарте пробелы игнорируются на первом проходе упорядочивания, поэтому порядок ближе к английскому словарю.

Например, в словаре у вас будет a priori между пасекой и прибытием .

Здесь при сравнении Cyb5 157.426 с Cyb561 0.425933 сравнивается первый Cyb5157.426 с Cyb5610.425933 на первом проходе, потому что первый вес символа пробела - IGNORE .

Если вы хотите избежать этой специальной обработки, вы можете изменить локаль на C , где порядок основан исключительно на значениях кодовых точек символов.

LC_ALL=C sort -d file

Или, как сказал @Swiss, сортировать только по первому полю:

sort -d -k1,1 file

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

Итак:

 b x
a x

с sort -d -k1,1 все равно будет отсортирован как

a x
 b x

в вашем регионе, потому что пробелы игнорируются, но как:

 b x
a x

В локали C как пробел сортирует перед a .

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

4
27.01.2020, 21:53

Теги

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