我想根据特定列使用 Unix 脚本对文件内容进行排序:
例如:在第 3 列对以下文件进行排序:
ax5aa
aa3ya
fg7ds
pp0dd
aa1bb
将导致
pp0dd
aa1bb
aa3ya
ax5aa
fg7ds
我尝试过 sort -k 3,3,但它只是对 3d 组单词(分隔符 = SPACE)进行排序。
有什么方法可以让 unix sort 以我喜欢的方式运行,还是应该使用其他工具?
$ 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,您说只有一个字段(整行)并且您正在比较该字段的第三个字符位置。
排序前使用sed创建列
$ echo "ax5aa
aa3ya
fg7ds
pp0dd
aa1bb" | sed 's/\(.\)/\1 /g' | sort -t ' ' -k3,3 | tr -d ' '
pp0dd
aa1bb
aa3ya
ax5aa
fg7ds
cat inputfile | perl -npe 's/(.)/ $1/g' | sort -k 3,3 | perl -npe 's/ //g'
我会直接坚持使用 perl 并定义一个比较器
echo $content | perl -e 'print sort {substr($a,3,1) cmp substr($b,3,1)} <>;'
对于在用作键的线段之前有一个或多个空格的行,我遇到了同样的问题。在要排序的文本中永远不存在的字段分隔符使整行成为一个字段,因此您可以使用例如:
sort -n -t\| -k1.3,1.3 inputfile