bash在数字前排序字符

时间:2015-08-17 20:28:55

标签: bash sorting

如何调用sort以确保以下列表是其随机化的结果?特别是,标准排序在[A-Za-z]之前排序[0-9],但在[0-9]之前我需要[A-Za-z]。我阅读了联机帮助页,但似乎没有任何内容。我读到语言环境会影响单个字符的排序,但哪个语言环境是正确的?

    01_abc
    02_abc
    02_01_abc
    02_02_abc
    02_02_01_abc
    02_02_02_abc
    02_02_03_abc
    02_03_abc
    03_abc
    04_abc

1 个答案:

答案 0 :(得分:0)

它非常丑陋,但是给出了包含示例数据的文件data,以及使文件中的行序列随机化的程序shufflesedsort,您可以使用:

shuffle data |
sed -e 's/[a-z][a-z]*/a:&/g' -e 's/[0-9][0-9]/d:&/g' |
sort |
sed 's/[ad]://g'

第一个sed标记带有a:(用于alpha)的字母字符串,以及带有d:(用于数字)的数字字符串,其中关键点是{{1}在a之前以任何合理的(升序)排序顺序出现。这意味着数据在数字之前用字母排序。第二个d删除标记。

步骤示例:

sed

在标记数字序列之前标记字母序列非常重要。请注意,每次运行时(至少对于少量运行),$ shuffle data 02_03_abc 04_abc 02_02_abc 02_02_02_abc 03_abc 02_02_01_abc 02_01_abc 02_abc 02_02_03_abc 01_abc $ shuffle data | sed -e 's/[a-z][a-z]*/a:&/g' -e 's/[0-9][0-9]/d:&/g' d:01_a:abc d:04_a:abc d:02_d:02_d:02_a:abc d:02_a:abc d:03_a:abc d:02_d:03_a:abc d:02_d:02_a:abc d:02_d:02_d:03_a:abc d:02_d:02_d:01_a:abc d:02_d:01_a:abc $ shuffle data | sed -e 's/[a-z][a-z]*/a:&/g' -e 's/[0-9][0-9]/d:&/g' | sort d:01_a:abc d:02_a:abc d:02_d:01_a:abc d:02_d:02_a:abc d:02_d:02_d:01_a:abc d:02_d:02_d:02_a:abc d:02_d:02_d:03_a:abc d:02_d:03_a:abc d:03_a:abc d:04_a:abc $ shuffle data | sed -e 's/[a-z][a-z]*/a:&/g' -e 's/[0-9][0-9]/d:&/g' | sort | sed 's/[ad]://g' 01_abc 02_abc 02_01_abc 02_02_abc 02_02_01_abc 02_02_02_abc 02_02_03_abc 02_03_abc 03_abc 04_abc $ 会产生不同的数据排列。

此技术 - 修改输入以便可以对键进行排序 - 也可以应用于其他排序操作。有时(通常是偶数),最好将关键数据添加到未修改的行,例如使用制表符分隔部分。这样可以更轻松地删除排序键。例如,如果您需要使用字母月份名称对日期进行排序,则可能需要将月份名称映射到数字。