我有多个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我该怎么做呢?
发布于 2017-06-21 07:46:18
您可以使用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/*发布于 2017-07-31 04:24:57
为什么不在一行之后回显散列值呢?
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"
donecut从shasum输出中剥离尾随的-。如果您愿意,可以在$hash周围添加引号。
您应该考虑跳过每个csv的标题行。
https://stackoverflow.com/questions/44662868
复制相似问题