У меня есть файл с разделителями в следующем формате:
text1|12345|email@email.com|01-01-2020|1
Учитывая, что все поля являются конфиденциальными данными,я написал следующую команду awk, чтобы замаскировать первое поле со случайными данными.
awk -F'|' -v cmd="strings /dev/urandom | tr -dc '0-9' | fold -w 5" 'BEGIN {OFS=FS} {cmd | getline a;$1=a;print}' source.dat > source_masked.dat
Если я хочу замаскировать дополнительные поля, я добавляю следующее.
awk -F'|' -v cmd1="strings /dev/urandom | tr -dc '0-9' | fold -w 5" -v cmd2="strings /dev/urandom | tr -dc 'A-Za-z0-9' | fold -w 7" 'BEGIN {OFS=FS} {cmd | getline a; cmd2 | getline b;$2=b}' source.dat > source_masked.dat
Как масштабироватьесли я хочу замаскировать 100 столбцов с разными типами данных?
По сути, я хочу взять из файла конфигурации следующее:
column number, datatype, length
и использовать его в awk для генерации команди сценарий замены динамически.
Не могли бы вы посоветовать то же самое?
Я переписал тот же самый принятый ответ на awk, поскольку для маскировки больших файлов с помощью bash потребовалось много времени.
Код для того же:
function mask(datatype, precision) {
switch (datatype) {
case "string":
command = "strings /dev/urandom | tr -dc '[:alpha:]' | fold -w "
precision
break
case "alphaNumeric":
command = "strings /dev/urandom | tr -dc '[:alnum:]' | fold -w "
precision
break
case "number":
command = "strings /dev/urandom | tr -dc '[:digit:]' | fold -w "
precision
break
default:
command = "strings /dev/urandom | tr -dc '[:alnum:]' | fold -w "
precision
}
command | getline v
return v
}
BEGIN {
while ((getline line < "properties.conf") > 0) {
split(line, a, ",")
col = a[1]
type = a[2]
len = a[3]
masks[col] = type " "
len
}
IFS = "|"
OFS = "|"
} {
for (i = 1; i <= NF; i++) {
if (masks[i] != "") {
split(masks[i], m, " ")
$i = mask(m[1], m[2])
}
}
print
}