我有一个要反转的数字列表。
它们已经排序。
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
另一个答案(容易记住但不如 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.
没有 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
另一种选择是使用Bash 字符串操作
$ numbers="35 53 102 342"
$ echo "${numbers// /$'\n'}"
35
53
102
342
$ echo "${numbers// /$'\n'}" | tac
342
102
53
35
使用 有很多答案tac
,但如果你想使用排序,它几乎是一样的:
printf "%s\n" 1 2 3 4 5 10 12 | sort -rn
n
很重要,因为它使它按数字排序。r
是相反的。
好吧,你可以写:
echo $(printf '%s\n' $NUMBERS | tac)
whereprintf '%s\n' ...
打印每个...
,每个后面都有一个换行符,并且$( ... )
是一个内置功能,xargs
几乎是多余的。
但是,我认为您不应该避免使用数组、IFS
等;它们使脚本在面对错误和/或意外输入时更加健壮。
如果您使用 对列表进行了排序sort
,您可能会考虑使用-r
reversed 选项
将空格更改为换行符的另一种方法是使用tr
:
echo 35 53 102 342|tr ' ' '\n'|tac|tr '\n' ' '
如果数据未排序,则替换tac
为sort -rn
。