我有一个我要反转的数字列表。
他们已经排序了。
35 53 102 342
我想要这个:
342 102 53 35
所以我想到了这个:
echo $NUMBERS | ??? | tac | xargs
什么是???
它应该将空格分隔列表转换为行分隔列表。
我想避免设置IFS
。
也许我可以使用bash数组,但是我希望有一个命令,其生命的目的是与xargs相反(也许xargs不仅仅是一个小技巧!)
答案 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)
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
。