【问题标题】:How to add SHA hash column dynamically to (every row in) CSV file?如何将 SHA 哈希列动态添加到 CSV 文件中的(每一行)?
【发布时间】:2017-06-20 20:57:17
【问题描述】:

我有多个 CSV 文件,格式如下:

"name","last_name","birth_day","register_date"
Michael,Jackson,August 29 - 1958,August 29 - 1958
Claude,Shannon,April 30 - 1916,April 30 - 1916

我想将每个文件转换为下一种格式:

"name","last_name","birth_day","register_date",sha256
Michael,Jackson,August 29 - 1958,August 29 - 1958,9949a1af67a3fb465eca01ca884f5ec7cd280078a39a0430a0f352bf19e16685  -
Claude,Shannon,April 30 - 1916,April 30 - 1916,fb464b3ab4f3f3db2384e192135cde97486ce96fe34e391a3294e5076f800aae  -

这意味着我想添加带有哈希值的“sha256”列。

到目前为止,我可以获得每一行的哈希值,但我不知道如何将此值作为“sha256”列添加到 CSV 文件中。

for file in ${DIR}/csv/*
do
    while IFS='' read -r line || [[ -n "$line" ]]; do
        echo -n $line | shasum -a 256
            /**
              Here it calculates the hash per row, and I want to add it
              at the end of the row as "sha256" column
            **/
    done < "$file"
done

我该怎么做?

【问题讨论】:

    标签: bash csv hash


    【解决方案1】:

    您可以使用awk 来执行此操作,它适用于GNU awk >= 4.1.0:

    awk -i inplace '
    function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
    {
        if (FNR > 1){
            cmd = "echo -n \""$0"\" | shasum -a 256"
            while (cmd | getline line) {
                split(line, arr, "-")
                print $0","rtrim(arr[1])
            }
            close(cmd)
        }
        else {
            print $0",sha256"
        }
    }' ${DIR}/csv/*
    
    • -i inplace 用于就地编辑文件
    • FNR是当前文件中的当前记录号
    • 请参阅this post 将变量传递给 shell 命令
    • sha256 命令结果根据- 分隔符进行拆分,以便仅保留 sha256 值。 rtrim 用于去除多余的空格

    【讨论】:

    • 看起来很棒;但是,它会抛出:/usr/local/bin/awk: Argument list too long。是因为换行吗?
    • awk --version 的输出是什么?
    • awk 版本 20070501,在 macos 上。该文件夹中有数千个 CSV 文件。
    • 你可以使用gawk,用brew install gawk安装它
    【解决方案2】:

    为什么不直接在行后面回显哈希值?

    for file in ${DIR}/csv/*
    do
        while IFS='' read -r line || [[ -n "$line" ]]; do
            hash=$(echo -n $line | shasum -a 256 | cut -d\  -f1)
            echo $line,$hash
        done < "$file"
    done
    

    cutshasum 输出中去除尾随的-。如果您愿意,请在 $hash 周围添加引号。

    您应该考虑跳过每个 csv 的标题行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 2021-04-04
      • 2014-01-27
      • 2015-12-03
      • 1970-01-01
      相关资源
      最近更新 更多