我正在尝试对一个文件进行排序,让我们调用
acr_list
,其中包含 3 个字段,最后一个是日期列。第一个和最后一个字段已完全填充,但第二个字段有间隙,例如;
sha:12344 2022-02-10
sha:12345 ['tag1','tag2'] 2022-01-24
sha:12346 2022-01-11
sha:12347 ['tag3,'tag-4'] 2022-01-03
使用按日期排序时得到意想不到的结果;
sort -b -k 3 --debug acr_list
对行进行排序,以便将有间隙的行放在顶部,并按第一个字段排序,并且没有间隙的行按日期按预期排序,例如;
sha:12344 2022-02-10
sha:12346 2022-01-11
sha:12347 ['tag3,'tag-4'] 2022-01-03
sha:12345 ['tag1','tag2'] 2022-01-24
这主要是为了更好地理解 sort 实际在做什么,并解释
--debug
标志的输出,特别是 s1
、s2
和 cmp1=1
在以下输出中的含义(我已替换实际摘要和标签名称);
Using collate rules of en_GB.UTF-8 locale
sort_method=mergesort
; k1=<2022-09-16>(10), k2=<2022-04-28>(10); s1=<sha256:12344 ['tag1'] 2022-09-16>, s2=<sha256:12345 ['tag2'] 2022-04-28>; cmp1=5
; k1=<2022-09-16>(10), k2=<>(0); s1=<sha256:12346 ['tag3'] 2022-09-16>, s2=<sha256:12347 2022-04-14>; cmp1=1
是否有任何地方记录了这一点?我搜索了很多手册页和指南/博客来找到它,但它似乎很晦涩。
我认为 k1 和 k2 是键(字段),括号中的数字(10)是字段中的字符数或列数,但无法弄清楚其他部分。
谢谢!
如果有帮助,我会深入了解;
如果无法按给定字段“$3”排序,则排序将默认按整行排序,在这种情况下,没有 $3,只有 $1 和 $2。
因此,如果日期位于最后一列,则要按日期排序,您可以重新格式化列表,使日期位于 $1 列中,并按 $1 列排序。这更多的是为了了解排序实用程序在行中字段数量不规则的情况下如何工作。