我想根据特定的列使用Unix脚本对文件内容进行排序:
ex:在第3列上对以下文件进行排序:
ax5aa
aa3ya
fg7ds
pp0dd
aa1bb
将导致
pp0dd
aa1bb
aa3ya
ax5aa
fg7ds
我尝试过排序-k 3,3,但它只是对3d组的单词排序(separator = SPACE)。
有没有办法让unix排序按照我喜欢的方式运行,还是应该使用其他工具?
答案 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)} <>;'