问题描述
文件如下所示:
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