在 linux 服务器上散列一个 CSV 列数据

问题描述

我有一个带有标题行的 CSV 文本文件

文件如下所示:

COLUMN1|COLUMN2|COLUMN3|COLUMN4|...|
Field1|Field2|Field3|Field4|...|
...

我需要隐藏(例如)第 2 列中的数据,而不影响文件中的任何其他条目。

我想使用诸如 SHA1 或 MD5 之类的散列算法来执行此操作,以便相同的字符串在遇到的任何地方都将解析为相同的散列值。关于如何在 linux 中使用 shell 脚本的任何输入。我尝试搜索并找到了在 powershell、Python 中执行的方法

非常感谢任何输入! 感谢您的时间!

解决方法

您可能安装了一种同时具有 CSV 和 Digest 模块的语言。也许ruby

ruby -rdigest -rcsv -e '
    encoder = Digest::SHA1.new
    output = CSV.new($stdout,col_sep: "|")
    nr = 0
    CSV.foreach(ARGV.shift,col_sep: "|") do |row|
        nr += 1
        row[1] = encoder.hexdigest(row[1]) if nr > 1
        output << row
    end
' file

否则,使用 bash 会更慢,并且 CSV 解析不涵盖 CSV 边缘情况

declare -A hashes
{
    IFS= read -r header
    echo "$header"
    while IFS='|' read -ra fields; do
        value=${fields[1]}
        if [[ -z ${hashes[$value]} ]]; then
            hashes[$value]=$(printf '%s' "$value" | md5sum | cut -d ' ' -f 1)
        fi
        fields[1]=${hashes[$value]}
        (IFS='|'; echo "${fields[*]}")
    done
} < file