我有多个具有下一个格式的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
cut
从shasum
输出中剥离尾随-
。如果您愿意,可以在$hash
周围添加引号。
您应该考虑跳过每个 csv 的标题行。