18

我有一个要反转的数字列表。

它们已经排序。

35 53 102 342

我要这个:

342 102 53 35

所以我想到了这个:

echo $NUMBERS | ??? | tac | xargs

是什么???

它应该将空格分隔列表转换为行分隔列表。

我想避免设置IFS.

也许我可以使用 bash 数组,但我希望有一个命令,其生活目的是做与 xargs 相反的事情(也许 xargs 不仅仅是一个技巧小马!!)

4

8 回答 8

23

你可以使用printf它。例如:

$ printf "%s\n" 35 53 102 342
35
53
102
342
$ printf "%s\n" 35 53 102 342|tac
342
102
53
35
于 2013-08-09T15:29:08.133 回答
11

另一个答案(容易记住但不如 printf 方法快):

$ xargs -n 1 echo

例如

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

这是选项xargs手册-n

-n number
         Set the maximum number of arguments taken from standard input for 
         each invocation of utility.  An invocation of utility will use less 
         than number standard input arguments if the number of bytes accumu-
         lated (see the -s option) exceeds the specified size or there are 
         fewer than number arguments remaining for the last invocation of 
         utility.  The current default value for number is 5000.
于 2013-10-26T16:01:02.417 回答
8

没有 tac 的 awk 单线:

awk '{NF++;while(NF-->1)print $NF}'

例如:

kent$  echo "35 53 102 342"|awk '{NF++;while(NF-->1)print $NF}'
342
102
53
35
于 2013-08-09T15:37:53.393 回答
5

另一种选择是使用Bash 字符串操作

$ numbers="35 53 102 342"
$ echo "${numbers// /$'\n'}"
35
53
102
342
$ echo "${numbers// /$'\n'}" | tac
342
102
53
35
于 2013-08-09T15:33:18.087 回答
3

使用 有很多答案tac,但如果你想使用排序,它几乎是一样的:

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

n很重要,因为它使它按数字排序。r是相反的。

于 2013-08-09T16:00:28.900 回答
3

好吧,你可以写:

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

whereprintf '%s\n' ...打印每个...,每个后面都有一个换行符,并且$( ... )是一个内置功能,xargs几乎是多余的。

但是,我认为您不应该避免使用数组、IFS等;它们使脚本在面对错误和/或意外输入时更加健壮。

于 2013-08-09T15:29:39.790 回答
2

如果您使用 对列表进行了排序sort,您可能会考虑使用-rreversed 选项

于 2013-08-09T15:33:26.767 回答
1

将空格更改为换行符的另一种方法是使用tr

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

如果数据未排序,则替换tacsort -rn

于 2013-08-10T09:42:16.460 回答