Sortuj z rozróżnianiem wielkości liter (małe litery przed wielkimi literami) w systemie MacOS w Terminalu

5

Próbuję użyć odpowiedzi w GNU Sortuj według wielkości liter posortować plik w moim systemie Mac OS.

Mój file.txt wygląda tak:

"Best"
"A"
"BEST"

W drugiej odpowiedzi na wspomniane pytanie mówi się, że można zrobić:

echo -e "d\nD\nc\nb\nB\na" | sort --ignore-case file.txt

a wyjście powinno być:

"A"
"Best"
"BEST"

Jednak gdy robię to na moim komputerze, otrzymuję:

"A"
"BEST"
"Best"

Nie ma znaczenia, czy używam --ignore-case czy nie, dane wyjściowe są takie same.

Może LC_COLLATE=C nie można ustawić w systemie Mac OS?

Czy ktoś wie, jak używać sort i mają małe litery & lt; wielkie litery w systemie Mac OS?

EDYTOWAĆ

@jaume zaleca instalację coreutils i używając sortowania GNU. próbowałem brew install coreutils i wtedy gsort -f file.txt ale wciąż nie miałem szczęścia.

regina_fallangi
źródło

Odpowiedzi:

1

Kolejność sortowania jest zdefiniowana w Twoim locale.

locale            
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

Gdy LC_COLLATE jest zdefiniowane jako LC_COLLATE = "en_US.UTF-8" w macOS, LC_COLLATE używa definicji C lub POSIX. Domyślne zachowanie sort ma sortować w kolejności ascii, gdzie wielkie litery mają pierwszeństwo przed małymi literami.

W systemie Linux, gdy LC_COLLATE = "en_US.UTF-8" definicja LC_COLLATE jest niestandardowa. Domyślne zachowanie sort ma na celu zignorowanie - małe litery mają pierwszeństwo przed dużymi literami.

Aby naśladować domyślne ustawienia Linuksa sort zachowanie na macOS, możesz użyć tr „tłumaczyć” małe litery na wielkie i wielkie na małe, sortować za pomocą ignore-case opcja ( -f ), a następnie ponownie zmień sprawę.

tr 'a-zA-Z' 'A-Za-z' <file.txt | sort -f | tr 'a-zA-Z' 'A-Za-z'

PRZYKŁAD:

cat file.txt
"cat"
"Best"
"A"
"BEST"
"Castro"
"alfred"
"a"
"CAT"

tr 'a-zA-Z' 'A-Za-z' <file.txt | sort -f | tr 'a-zA-Z' 'A-Za-z'
"a"
"A"
"alfred"
"Best"
"BEST"
"Castro"
"cat"
"CAT"    
fd0
źródło
Cześć @ fd0, sort -m "$@" file.txt | tr 'a-zA-Z' 'A-Za-z' | sort file.txt Prace. Ostatnie polecenie należy usunąć lub zamienić wszystkie małe litery na wielkie litery. Czy mógłbyś usunąć tę część? Dziękuję za odpowiedź!
regina_fallangi
Rozumiem tylko, że dane wyjściowe jednego polecenia są podawane do innego, ale muszę szczerze powiedzieć, że nie byłem pewien, gdzie powinienem umieścić nazwę pliku. Próbowałem różnych kombinacji, a ta w moim pierwszym komentarzu zadziałała. Z przyjemnością dowiesz się, gdzie należy ustawić nazwę pliku w oryginalnym rozwiązaniu. Dzięki.
regina_fallangi