繁体   English   中英

使用分隔符“。”对多列进行排序在 bash

[英]Sorting multiple columns with delimiter "." in bash

我正在尝试对如下所示的文本列表进行排序:

2023.12.14
2020.10.4
2020.10.1
2020.5.18
2023.14.1
2021.1.1

所需的输出:

2020.5.18
2020.10.1
2020.10.4
2021.1.1
2023.12.14
2023.14.1

我尝试使用以下命令来实现它:

sort -t "." -k1,1 -k2,1 -k3,1 sortingTest.txt

使用此命令,我尝试按第一个“列”(分隔符“。”之前的任何内容)对其进行排序,如果两个值相等,则比较第二列的值等。

由于某种原因,它仅通过比较第一列的值进行排序。

我错过了什么?

认为sort -V可以根据需要对数据进行排序:

$ echo '2023.12.14
> 2020.10.4
> 2020.10.1
> 2020.5.18
> 2023.14.1
> 2021.1.1' | sort -V

2020.5.18
2020.10.1
2020.10.4
2021.1.1
2023.12.14
2023.14.1

您遇到了一些问题, -k定义为: -kfield1[,field2] ,这意味着-k2,1无效。 您可以使用-k1 -k2 -k3对前三个字段进行排序。

您正确地希望对字段进行数字排序,可以使用-n see man 1 sort启用其他数字排序选项:

$ sort -t. -n -k1 -k2 -k3 file.txt
2020.5.18
2020.10.1
2020.10.4
2021.1.1
2023.12.14
2023.14.1

可能对你有用。

如果这些实际上是版本而不是日期,那么-V可能就足够了。

AFAIK 唯一可以通过sort来完成的方法是使用-V 但是-V不是 POSIX,并且在某些类型的实现中不可用。 所以这是一个 POSIX(便携式)解决方案:

awk -F . '{printf "%04d.%02d.%02d\n", $1,$2,$3}' dates-file |
sort |
awk -F . '{printf "%d.%d.%d\n", $1,$2,$3}'

awk 将字段转换为固定长度以进行排序,然后再次将排序的数据转换为原始格式。 这假设这些是日期。

没有我希望的那么好的解决方案 - 这个解决方案特定于mawk-1gawk 限制是:

  • 中场和最右边场的硬上限为8^5-1
  • 最左边的字段最多允许8^6-1

该方法是创建一个统一的排序键,以数字和ASCII字节顺序对相同的排序键进行排序,同时为 3 个字段中的每一个字段留出足够的增长空间。

纯副本以LIFO为基础打印出来

2 个前缀ascii control bytes用于防止进程流中的任何地方,无论是在awk之内还是之外,当它看到可能80-bit大小的十六进制时,尝试以浮点精度不足的纯数字。

WHINY_USERS=1 {m,g}awk '        # this is a shell param for mawk-1
BEGIN {
        PROCINFO["sorted_in"] = "@ind_str_asc"
        FS = "["(_=+(\
       OFS = "." ) )"]" 
} { __[\
    ____($_)]=$_ } END { for(_ in __) {
                            print __[_] } } 
function ____(___,__,_) {
    return  \
    sprintf("\31\17%.*s%.8X%.4X%.8X",(__="")*split(__,_),
    split(___,_,"[.]"), int((__=_[++__]*(___=(++__^++__\
           )^(__--+__))*___ + _[__]*___ + _[++__]) \
           )/(___+=___),__%___,___*___-___^(!___)-NR) 
}'

|

2020.5.18
2020.10.1
2020.10.4
2021.1.1
2023.12.14
2023.14.1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM