git 如何使用预提交挂钩对csv文件进行排序

new9mtju  于 2023-01-19  发布在  Git
关注(0)|答案(2)|浏览(158)

我有一个.csv文件,我想排序预提交。我found这个预提交挂钩file-contents-sorter排序的第一个值的文件。

repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v2.1.0
    hooks:
       - id: file-contents-sorter
         files: blackbox-files\.csv$

但我想先按最后一个值排序,然后按第一个值排序。我想知道是否可以用预提交git钩子来做类似的事情。
我的csv文件是这样的:

aaaa,bbbb
sssss,bbbb
fff,bbb
kkkk,eeee
www,ddd

The above code gives me this output:

aaaa,bbbb
fff,bbb
kkkk,eeee
sssss,bbbb
www,ddd

I'd like this output:

aaaa,bbbb
fff,bbb
sssss,bbbb
www,ddd
kkkk,eeee
dhxwm5r4

dhxwm5r41#

基于一个简单的hack和sort 's ability to sort by arbitrary columns,下面是如何使用GNU sort实现这一点:

- id: sort
    name: Sort records
    entry: bash
    args:
      [
        -c,
        'for index in $(seq 0 "$#"); do LC_COLLATE=C.UTF-8 sort
        --field-separator=, --key=2,2 --key=1,1
        --output="${!index}" "${!index}"; done',
      ]
    files: blackbox-files\.csv$
    language: system

基本上,由于sort一次只能就地排序一个文件,因此我们必须遍历整个参数数组(不是$@,因为它不包括$0)。LC_COLLATE设置用于排序或排序的语言环境,以确保排序在不同的机器上是一致的。大多数sort参数都是用来按第二个和第一个逗号排序的-分隔字段。

7hiiyaii

7hiiyaii2#

这里有一个未解决的问题,你有bbb排序在bbbb之前和之后,最简单的解释是第一个字段覆盖了第二个字段,但是你也有kkkk,eeee排序在www,ddd之后,最简单的解释是第二个字段覆盖了第一个字段,也许我在这里只是盲点,这是一个次要的问题,所以我会做一些东西,来产生你给出的结果,然后使用它,我使用的排序键可以,但是可能不会一直都是你想要的,检查一下。
在进入存储库的过程中清理文件的一般方法是使用过滤器。

git config filter.blackbox.clean 'sort -k2.1,2.1 -k1 -t,'
git config filter.blackbox.smudge cat

以及

echo blackbox-files.txt filter=blackbox >>.gitattributes

然后文件将被过滤添加。过滤器规格本身必须(重新)配置在任何使用它们的repo中,这是一个严重的不好的强迫需要不邀请代码注入攻击,对不起,但ILOVEYOU是不有趣的。在您的自述文件中做一个笔记,或添加几行在您的设置食谱,无论您如何做您的新repo onboarding这是另一个恼人的步骤。

相关问题