没有分隔符的列上的unix排序

时间:2012-09-12 08:05:08

标签: unix sorting

我想根据特定的列使用Unix脚本对文件内容进行排序:

ex:在第3列上对以下文件进行排序:

ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

将导致

pp0dd
aa1bb
aa3ya
ax5aa
fg7ds

我尝试过排序-k 3,3,但它只是对3d组的单词排序(separator = SPACE)。

有没有办法让unix排序按照我喜欢的方式运行,还是应该使用其他工具?

4 个答案:

答案 0 :(得分:10)

$ sort --key=1.3,1.3 inputfile
pp0dd
aa1bb
aa3ya
ax5aa
fg7ds

排序手册页:

[...]

-k, - key = POS1 [,POS2]

在POS1(原点1)开始一个键,在POS2(默认行尾)结束

[...]

POS是F [.C] [OPTS],其中F是字段编号,C是字段中的字符位置;两者都是原点1.如果-t和-b都不起作用,则字段中的字符从前一个空格的开头计算。 OPTS是一个或多个单字母排序选项,它覆盖该键的全局排序选项。如果没有给出密钥,请使用整行作为密钥。

使用--key = 1.3,1.3,你说只有一个字段(整行)并且你正在比较这个字段的第三个字符位置。

答案 1 :(得分:4)

使用 sed 在排序前创建列

$ echo "ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb" | sed 's/\(.\)/\1 /g' | sort -t ' ' -k3,3 | tr -d ' '

pp0dd
aa1bb
aa3ya
ax5aa
fg7ds

答案 2 :(得分:2)

cat inputfile | perl -npe 's/(.)/ $1/g' | sort -k 3,3 | perl -npe 's/ //g'

答案 3 :(得分:1)

我会直接坚持perl并定义一个比较器

echo $content | perl -e 'print sort {substr($a,3,1) cmp substr($b,3,1)} <>;'