8

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

例如:在第 3 列对以下文件进行排序:

ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

将导致

pp0dd
aa1bb
aa3ya
ax5aa
fg7ds

我尝试过 sort -k 3,3,但它只是对 3d 组单词(分隔符 = SPACE)进行排序。

有什么方法可以让 unix sort 以我喜欢的方式运行,还是应该使用其他工具?

4

5 回答 5

11
$ 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,您说只有一个字段(整行)并且您正在比较该字段的第三个字符位置。

于 2012-10-01T14:53:00.070 回答
4

排序前使用sed创建列

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

pp0dd
aa1bb
aa3ya
ax5aa
fg7ds
于 2012-09-12T08:12:01.543 回答
2
cat inputfile | perl -npe 's/(.)/ $1/g' | sort -k 3,3 | perl -npe 's/ //g'
于 2012-09-12T08:14:47.577 回答
1

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

echo $content | perl -e 'print sort {substr($a,3,1) cmp substr($b,3,1)} <>;'
于 2012-09-12T08:20:02.960 回答
0

对于在用作键的线段之前有一个或多个空格的行,我遇到了同样的问题。在要排序的文本中永远不存在的字段分隔符使整行成为一个字段,因此您可以使用例如:

sort -n -t\| -k1.3,1.3 inputfile
于 2022-01-31T20:32:38.920 回答