Сортировать только по первому столбцу

То, что вы пробовали:

first_arg=$1
shift

#...later...

else
    node default.js "$first_arg" "$@"
fi

Это было бы идентично вашему первому варианту при условии наличия хотя бы одного аргумента командной строки.

Без аргументов командной строки "$first_arg"по-прежнему будет пустой строкой и, следовательно, аргументом, тогда как "$@"не будет генерировать даже пустую строку.

Если ваше приложение Node принимает пустой аргумент в командной строке, это может привести к тому, что приложение будет вести себя по-разному в ваших двух вариантах кода.

Если вызов вашего скрипта без аргументов командной строки допустим, вы можете

node default.js ${first_arg:+"$first_arg"} "$@"

где ${first_arg:+"$first_arg"}будет расширяться до нуля, если first_argпусто или не задано, но до "$first_arg", если first_argбыло установлено на непустую -строку. Или, если вы хотите вызвать явный сбой для неустановленной или пустой переменной:

node default.js "${first_arg:?Error, no command line arguments}" "$@"

Альтернативы включают создание копии $@в виде bashмассива , как показывает Джесси _b в своем ответе .

Помещение $first_argобратно в $@с помощью

set -- "$first_arg" "$@"`

не будет работать, так как это будет включать пустой аргумент, как $1в $@, если аргумент командной строки отсутствует.

С

set -- ${first_arg:+"$first_arg"} "$@"`

вы бы ничего не "сдвинули", если бы $first_argбыло пустым или если бы переменная не существовала.


Обратите внимание, что сдвиг аналогичен сдвигу 1, и отдельные операторы не нужно завершать символом ; если за ним не следует другой оператор в той же строке (новая строка является терминатором команды, как и ; ).

0
30.08.2020, 15:24
2 ответа

Запустить с параметром отладки. Первое подчеркивание — основная сортировка, следующие — вспомогательная

sort -n -k1,1 --debug test1
sort: text ordering performed using simple byte comparison
1 4
_
___
2 1
_
___
2 5 
_
____
3 6
_
___

Обратите внимание, что второе подчеркивание начинается с первого поля!
Чтобы было легче понять, вы можете воспринимать это так:

1 (1 4)
2 (2 1)  
2 (2 5)
3 (3 6)
1
18.03.2021, 23:08

Это последнее -средство сравнения, которое сравнивает полные строки лексически, когда в противном случае они сравниваются одинаково на основе спецификации ключа сортировки.

С реализацией GNU sortвы можете добавить опцию -s, чтобы отключить это последнее сравнение -. Алгоритм сортировки GNU sortявляется стабильным , вы получите исходный порядок на входе, поэтому:

sort -s -n -k1,1

Или просто:

sort -sn

(поскольку сравнение является числовым, не будет иметь значения, будет ли это полная строка или первое поле, преобразованное в число для сравнения ).

2
18.03.2021, 23:08

Теги

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