如何对字符串中的字符进行排序?

问题描述 投票:0回答:6

我想对字符串中的字符进行排序。

例如

echo cba | sort-command
abc

是否有命令允许我执行此操作,或者我必须编写

awk
脚本来迭代字符串并对其进行排序?

unix command-line sorting
6个回答
48
投票
echo cba | grep -o . | sort |tr -d "\n"

16
投票

请找到以下有用的方法:

外壳

根据字符对字符串进行排序:

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 中对数组进行排序


7
投票

这是作弊行为(因为它使用 Perl),但是有效。 :-P

echo cba | perl -pe 'chomp; $_ = join "", sort split //'

6
投票

又一个

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

0
投票

这作为对其中一个解决方案的评论会更合适(唉,我的声誉还没有达到那么低的标准,该死的我的潜伏),但我认为值得一提的是,分隔字母可以在贝壳。避免编写代码总是值得的,但是这个

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

显然更有效,但加载它相对昂贵)。如果上述操作在不确定执行次数的循环的一个或多个步骤中进行,则效率的差异可能会增加(此时有些人可能会主张切换工具并重写,但这是另一组权衡) .


0
投票
@ghostdog74的答案

fish shell中实现: readarray -t FLETRS < <(echo $FRED | grep -o .)

© www.soinside.com 2019 - 2024. All rights reserved.