adm*_*min 1 sorting bash perl awk sed
我有很多如下所示的列表,第一列是 ID 号,第二列是分数,第三列是 DDMMYYYY 格式的出生日期。
111 100 01012011
222 90 01012001
333 90 01012013
444 80 01012015
555 80 01012014
666 70 01012016
777 60 01012017
888 50 01012018
Run Code Online (Sandbox Code Playgroud)
当有多行具有相同分数时,我想将它们重新排序,并将最新日期放在顶部,示例的结果将是:
111 100 01012011
333 90 01012013
222 90 01012001
555 80 01012014
444 80 01012015
666 70 01012016
777 60 01012017
888 50 01012018
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,具有相同分数的行已重新排列,最新日期位于顶部。
我首先尝试选择最早的日期,我可以通过以下方式执行此操作:
sort -k1.5 -k1.1,1.2 -k1.3,1.4 | tail -n 1
Run Code Online (Sandbox Code Playgroud)
但我不确定如何才能实现结果。我怎样才能达到结果?
当前尝试的问题sort是,-k1.当您想要解析第三个字段 ( ) 时,您正在尝试解析第一个字段 ( -k3.)。
设置,添加一些日期以外的条目DDMM == 0101:
$ cat raw.dat
111 100 01012011
222 90 01012001
333 90 01012013
444 80 01012015
555 80 01012014
666 70 01012016
777 60 01012017
888 50 01012018
aaa 35 01082022
bbb 35 23012022
ccc 35 12112022
ddd 35 10122022
Run Code Online (Sandbox Code Playgroud)
一种方法,假设第一个排序是按score数字降序排列第二个字段 ( ):
$ sort -t' ' -k2,2nr -k3.5,3.8nr -k3.3,3.4nr -k3.1,3.2nr raw.dat
111 100 01012011
333 90 01012013
222 90 01012001
444 80 01012015
555 80 01012014
666 70 01012016
777 60 01012017
888 50 01012018
ddd 35 10122022
ccc 35 12112022
aaa 35 01082022
bbb 35 23012022
Run Code Online (Sandbox Code Playgroud)
在哪里:
-t ' '- 将分隔符定义为空格(覆盖默认值,即非空白到空白的转换,这将导致前导空格被计为字段的一部分)-k2,2nr- 第一个排序 ( score),以 field 开头2,以 field 结尾2,按n数字顺序和r反序(又称降序)排序-k3.5,3.8nr- 第二次排序 ( ),以字段和第一个字符YYYY开始,以字段和第一个字符结束,按数字和反序排序(并分别对和执行反数字排序)3538nr-k3.3,3.4nr-k3.1,3.2nrrnMMDDID=555( YYYY=2014) 列在ID=444( YYYY=2015) 之前;我假设这是一个拼写错误,ID=444应该首先列出将埃德·莫顿的评论拉入这个答案......
-b丢弃所有前导空格(即替换-t ' ')但是...-b在键级别应用标志时,必须在每个键上应用该选项;或者 ...-b只要没有键级别标志,该选项就可以用作全局标志(键级别标志优先于 - 并否定 - 全局级别标志)应用这些规则,我们得到以下结果之一:
# all global-level flags
sort -nrb -k2,2 -k3.5,3.8 -k3.3,3.4 -k3.1,3.2 raw.dat
# all key-level flags ('start' only needs '-b` flag)
sort -k2b,2bnr -k3.5b,3.8bnr -k3.3b,3.4bnr -k3.1b,3.2bnr raw.dat
# all key-level flags (overkill on the 'start' flags)
sort -k2bnr,2bnr -k3.5bnr,3.8bnr -k3.3bnr,3.4bnr -k3.1bnr,3.2bnr raw.dat
Run Code Online (Sandbox Code Playgroud)
这些都会生成:
111 100 01012011
333 90 01012013
222 90 01012001
444 80 01012015
555 80 01012014
666 70 01012016
777 60 01012017
888 50 01012018
ddd 35 10122022
ccc 35 12112022
aaa 35 01082022
bbb 35 23012022
Run Code Online (Sandbox Code Playgroud)