如何将 SHA 哈希列动态添加到 CSV 文件中(每一行)



我有多个具有下一个格式的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

我该怎么做?

您可以使用

awk来执行此操作,它将适用于GNU awk>= 4.1.0:

awk -i inplace '
function rtrim(s) { sub(/[ trn]+$/, "", 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是当前文件中的当前记录编号
  • 请参阅这篇文章,了解如何将变量传递给 shell 命令
  • sha256命令结果根据-分隔符进行拆分,以便仅保留 SHA256 值。 rtrim用于删除多余的空间

你为什么不只回显行后面的哈希值呢?

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 的标题行。

最新更新