Ответ 1
Вы можете использовать printf
для этого. Например:
$ printf "%s\n" 35 53 102 342
35
53
102
342
$ printf "%s\n" 35 53 102 342|tac
342
102
53
35
У меня есть список чисел, которые я хочу изменить.
Они уже отсортированы.
35 53 102 342
Я хочу это:
342 102 53 35
Итак, я подумал об этом:
echo $NUMBERS | ??? | tac | xargs
Что???
Он должен превратить список, разделенный пробелами, в список, разделенный линией.
Мне бы хотелось не устанавливать IFS
.
Может быть, я могу использовать массивы bash, но я надеялся, что там будет команда, целью которой является сделать противоположность xargs (возможно, xargs - это больше, чем один трюк-пони!)
Вы можете использовать printf
для этого. Например:
$ printf "%s\n" 35 53 102 342
35
53
102
342
$ printf "%s\n" 35 53 102 342|tac
342
102
53
35
awk однострочный без tac:
awk '{NF++;while(NF-->1)print $NF}'
например:
kent$ echo "35 53 102 342"|awk '{NF++;while(NF-->1)print $NF}'
342
102
53
35
Другим вариантом является использование Bash манипуляции с строкой
$ numbers="35 53 102 342"
$ echo "${numbers// /$'\n'}"
35
53
102
342
$ echo "${numbers// /$'\n'}" | tac
342
102
53
35
Другой ответ (легко запомнить, но не так быстро, как метод printf):
$ xargs -n 1 echo
например.
$ NUMBERS="35 53 102 342"
$ echo $NUMBERS | xargs -n 1 echo | tac | xargs
342 102 53 35
Ну, вы могли бы написать:
echo $(printf '%s\n' $NUMBERS | tac)
где printf '%s\n' ...
печатает каждый из ...
с новой строкой после каждого, а $( ... )
- встроенная функция, которая делает xargs
почти лишней.
Однако я не думаю, что вам следует избегать использования массивов, IFS
и т.д.; они делают скрипты более надежными в отношении ошибок и/или неожиданного ввода.
Там много ответов с помощью tac
, но если вы хотите использовать сортировку, то это почти то же самое:
printf "%s\n" 1 2 3 4 5 10 12 | sort -rn
n
важен, поскольку он делает его сортировкой численно. r
является обратным.
Если вы отсортировали свой список с помощью sort
, вы могли бы рассмотреть вариант -r
с обратным знаком
Другой способ изменить пространство на символы новой строки и наоборот: tr
:
echo 35 53 102 342|tr ' ' '\n'|tac|tr '\n' ' '
Если данные не отсортированы, замените tac
на sort -rn
.