我想对字符串中的字符进行排序。
例如
echo cba | sort-command
abc
是否有命令允许我执行此操作,或者我必须编写
awk
脚本来迭代字符串并对其进行排序?
echo cba | grep -o . | sort |tr -d "\n"
请找到以下有用的方法:
外壳
根据字符对字符串进行排序:
echo cba | grep -o . | sort | tr -d "\n"
以空格分隔的字符串:
echo 'dd aa cc bb' | tr " " "\n" | sort | tr "\n" " "
Perl
print (join "", sort split //,$_)
红宝石
ruby -e 'puts "dd aa cc bb".split(/\s+/).sort'
猛击
使用 bash,你必须枚举字符串中的每个字符,通常类似于:
str="dd aa cc bb";
for (( i = 0; i < ${#str[@]}; i++ )); do echo "${str[$i]}"; done
要对数组进行排序,请查看:如何在 bash 中对数组进行排序?
这是作弊行为(因为它使用 Perl),但是有效。 :-P
echo cba | perl -pe 'chomp; $_ = join "", sort split //'
又一个
perl
单行
$ echo cba | perl -F -lane 'print sort @F'
abc
$ # for reverse order
$ echo xyz | perl -F -lane 'print reverse sort @F'
zyx
$ # or
$ echo xyz | perl -F -lane 'print sort {$b cmp $a} @F'
zyx
-l
选项
@F
数组中@F
被打印
对于给定的输入文件,这也将按行工作
$ cat ip.txt
idea
cold
spare
umbrella
$ perl -F -lane 'print sort @F' ip.txt
adei
cdlo
aeprs
abellmru
这作为对其中一个解决方案的评论会更合适(唉,我的声誉还没有达到那么低的标准,该死的我的潜伏),但我认为值得一提的是,分隔字母可以在贝壳。避免编写代码总是值得的,但是这个
letsep函数非常小:
grep -o .
。 。 。对于任意长度的输入字符串,每行输出一个字母。例如,一旦定义了letsep
,就可以使用变量 FRED 中包含的字符串的字母填充数组 FLETRS(假设当代 bash)如下:
letsep ()
{
INWORD="$1"
while [ "$INWORD" ]
do
echo ${INWORD:0:1}
INWORD=${INWORD#?}
done
}
。 。 。对于字大小的字符串,其运行速度大约是同等字符串的两倍:
readarray -t FLETRS < <(letsep $FRED)
是否值得设置取决于应用程序。我只是粗略地测量了这一点,但较慢的程序代码似乎比上下文切换最多保持 60 个字符的优势(grep
显然更有效,但加载它相对昂贵)。如果上述操作在不确定执行次数的循环的一个或多个步骤中进行,则效率的差异可能会增加(此时有些人可能会主张切换工具并重写,但这是另一组权衡) .
在fish shell中实现:
readarray -t FLETRS < <(echo $FRED | grep -o .)