【问题标题】:sort on part of the line, keep order on tie排序在行的一部分,保持领带的顺序
【发布时间】:2014-01-15 10:52:14
【问题描述】:

我想按日期(不是按时间)订购 git log 的一些输出

不幸的是,仅按某些字符排序似乎是不可能的,而忽略了sort 的其余部分。到目前为止我尝试了什么:

输入:git-log.txt

git log --date-order --reverse --show-all --pretty="%ai#%h %s"

2013-08-22 09:54:12 +0200#f03fec1 G  
2013-08-21 10:43:57 +0200#c026cd6 A
2013-08-21 10:49:58 +0200#4630c3f B
2013-08-21 11:14:42 +0200#6e7141d C
2013-08-21 13:02:59 +0200#23ab0a8 D
2013-08-21 10:39:23 +0200#06b83f7 E
2013-08-21 14:10:16 +0200#f53384e F
2013-08-20 16:22:33 +0200#12591fb Z

naiv:这将完美地排序,包括日期

sort -k 1.1,1.10 git-log.txt

通过解决与不存在的列的关系来欺骗

sort -k 1.1,1.10 -k 200 git-log.txt

欺骗它将整行解释为不存在分隔字符的单列

sort -k 1.1,1.10 -t "^" git-log.txt

在所有情况下,输出都是:

2013-08-20 16:22:33 +0200#12591fb Z
2013-08-21 10:39:23 +0200#06b83f7 E
2013-08-21 10:43:57 +0200#c026cd6 A
2013-08-21 10:49:58 +0200#4630c3f B
2013-08-21 11:14:42 +0200#6e7141d C
2013-08-21 13:02:59 +0200#23ab0a8 D
2013-08-21 14:10:16 +0200#f53384e F
2013-08-22 09:54:12 +0200#f03fec1 G

我需要(见commit E的位置)

2013-08-20 16:22:33 +0200#12591fb Z
2013-08-21 10:43:57 +0200#c026cd6 A
2013-08-21 10:49:58 +0200#4630c3f B
2013-08-21 11:14:42 +0200#6e7141d C
2013-08-21 13:02:59 +0200#23ab0a8 D
2013-08-21 10:39:23 +0200#06b83f7 E
2013-08-21 14:10:16 +0200#f53384e F
2013-08-22 09:54:12 +0200#f03fec1 G

如何教sort 在平局上保持排序? 我可以在输出中添加任何需要的字符...

【问题讨论】:

    标签: git bash sorting git-log


    【解决方案1】:

    您似乎正在寻找sort-s 选项:

       -s, --stable
              stabilize sort by disabling last-resort comparison
    

    sort -k 1.1,1.10 -t "^" -s git-log.txt
    

    改为。

    【讨论】:

    • 我现在感觉很笨。已阅读手册页 2 小时,忽略它。 :-( 谢谢
    【解决方案2】:

    还要注意 sort --debug 选项来帮助解决这个问题(在这种情况下它会使第二个有问题的排序变得明显)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      相关资源
      最近更新 更多