Как выполнить обратное "xargs"?

У меня есть список чисел, которые я хочу изменить.

Они уже отсортированы.

35 53 102 342

Я хочу это:

342 102 53 35

Итак, я подумал об этом:

echo $NUMBERS | ??? | tac | xargs

Что???

Он должен превратить список, разделенный пробелами, в список, разделенный линией.

Мне бы хотелось не устанавливать IFS.

Может быть, я могу использовать массивы bash, но я надеялся, что там будет команда, целью которой является сделать противоположность xargs (возможно, xargs - это больше, чем один трюк-пони!)

Ответ 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

Ответ 2

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

Ответ 3

Другим вариантом является использование Bash манипуляции с строкой

$ numbers="35 53 102 342"
$ echo "${numbers// /$'\n'}"
35
53
102
342
$ echo "${numbers// /$'\n'}" | tac
342
102
53
35

Ответ 4

Другой ответ (легко запомнить, но не так быстро, как метод printf):

$ xargs -n 1 echo

например.

$ NUMBERS="35 53 102 342"
$ echo $NUMBERS | xargs -n 1 echo | tac | xargs
342 102 53 35

Ответ 5

Ну, вы могли бы написать:

echo $(printf '%s\n' $NUMBERS | tac)

где printf '%s\n' ... печатает каждый из ... с новой строкой после каждого, а $( ... ) - встроенная функция, которая делает xargs почти лишней.

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

Ответ 6

Там много ответов с помощью tac, но если вы хотите использовать сортировку, то это почти то же самое:

printf "%s\n" 1 2 3 4 5 10 12 | sort -rn

n важен, поскольку он делает его сортировкой численно. r является обратным.

Ответ 7

Если вы отсортировали свой список с помощью sort, вы могли бы рассмотреть вариант -r с обратным знаком

Ответ 8

Другой способ изменить пространство на символы новой строки и наоборот: tr:

echo 35 53 102 342|tr ' ' '\n'|tac|tr '\n' ' '

Если данные не отсортированы, замените tac на sort -rn.