unix排序,主键和辅助键

zse*_*der 15 unix sorting bash

我想在更多字段上对文件进行排序.选项卡分隔文件是:

a   1   1.0
b   2   0.1
c   3   0.3
a   4   0.001
c   5   0.5
a   6   0.01
b   7   0.01
a   8   0.35
b   9   2.3
c   10  0.1
c   11  1.0
b   12  3.1
a   13  2.1
Run Code Online (Sandbox Code Playgroud)

我希望按字母顺序按字段1(带-d)排序,当field1相同时,按字段3排序(带-g选项).

A没有成功这样做.我的尝试是(使用真正的TAB字符代替<TAB>):

cat tst | sort -t"<TAB>" -k1 -k3n
cat tst | sort -t"<TAB>" -k1d -k3n
cat tst | sort -t"<TAB>" -k3n -k1d
Run Code Online (Sandbox Code Playgroud)

这些都不起作用.我不确定排序是否能够做到这一点.我会编写一个解决方法的脚本,所以我只是好奇是否有一个只使用排序的解决方案.

Jan*_*net 13

手册显示了一些例子.

根据zseder的评论,这有效:

sort -t"<TAB>" -k1,1d -k3,3g
Run Code Online (Sandbox Code Playgroud)

Tab理论上也应该像这样工作sort -t"\t".

如果上述任何一项都没有通过制表符分隔,这是一个丑陋的解决方法:

TAB=`echo -e "\t"`
sort -t"$TAB"
Run Code Online (Sandbox Code Playgroud)

  • 你也可以不使用`echo`或ctrl + v创建一个标签:`TAB = $'\ t'`.@zseder:逗号是此上下文中的范围运算符.参数`-k1,1d`的意思是"从第一列开始创建一个键,以字典顺序在第一列结束". (2认同)