如何调用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
答案 0 :(得分:0)
它非常丑陋,但是给出了包含示例数据的文件data
,以及使文件中的行序列随机化的程序shuffle
,sed
和sort
,您可以使用:
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
$
会产生不同的数据排列。
此技术 - 修改输入以便可以对键进行排序 - 也可以应用于其他排序操作。有时(通常是偶数),最好将关键数据添加到未修改的行,例如使用制表符分隔部分。这样可以更轻松地删除排序键。例如,如果您需要使用字母月份名称对日期进行排序,则可能需要将月份名称映射到数字。