如何执行`xargs`的反转?

时间:2013-08-09 15:26:08

标签: linux bash unix

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

他们已经排序了。

35 53 102 342

我想要这个:

342 102 53 35

所以我想到了这个:

echo $NUMBERS | ??? | tac | xargs

什么是???

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

我想避免设置IFS

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

8 个答案:

答案 0 :(得分:17)

您可以使用printf。例如:

$ printf "%s\n" 35 53 102 342
35
53
102
342
$ printf "%s\n" 35 53 102 342|tac
342
102
53
35

答案 1 :(得分:8)

没有tac的awk one-liner:

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

例如:

kent$  echo "35 53 102 342"|awk '{NF++;while(NF-->1)print $NF}'
342
102
53
35

答案 2 :(得分:8)

另一个答案(容易记住,但没有printf方法那么快):

$ xargs -n 1 echo

e.g。

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

答案 3 :(得分:5)

另一种选择是使用Bash string manipulation

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

答案 4 :(得分:3)

好吧,你可以写:

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

其中printf '%s\n' ...打印每个...,每个$( ... )后面都有换行符,而xargs是一个内置功能,使IFS几乎是多余的。

但是,我认为你不应该避免使用数组,{{1}}等等;它们使得脚本在遇到错误和/或意外输入时更加健壮。

答案 5 :(得分:3)

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

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

n非常重要,因为它可以按数字排序。 r是相反的。

答案 6 :(得分:2)

如果您已使用sort对列表进行排序,则可能会考虑-r撤消选项

答案 7 :(得分:1)

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

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

如果数据未排序,请将tac替换为sort -rn