Функции данных в Unix
Я хочу шифровать 2-й и 4-й столбец данных.
[1234567890] -> [8728125870]
Входные данные:
First_name,id,second_name,phone_number
ram,232,prakash,96
hari,123,pallavi,98
anurag,456,aakash,13
Ожидаемый выход:
First_name,id,second_name,phone_number
ram,727,prakash,82
hari,872,pallavi,78
anurag,812,aakash,87
2 ответа
Шаг 1:
Генерация случайного числа для замены. Это сделано с чем-то похожим на $(($RANDOM * 32768 + $RANDOM))
; если вам нужно больше деталей, дайте мне знать.
Шаг 2:
использование tr
заменить все номера на "заглавные" версии и заменить их нужными номерами. Так что для вашего примера, чтобы заменить только 1, 2 и 3, вы должны выполнить:
cat inputfile | tr '1' '!' | tr '2' '@' | tr '3' '#' | tr '4' '$' | tr '5' '%' | tr '6' '^' | tr '7' '&' | tr '9' '(' | tr '!' '8' | tr '@' '7' | tr '#' '2' | tr '$' '8' | tr '%' '1' | tr '^' '2' | tr '&' '5' | tr '(' '7'
Примечание: чтобы получить нужный эффект, вам нужно расширить указанную выше команду, чтобы он работал. Запуск его несколько раз даст неверные результаты.
Вывод вышеуказанной команды:
First_name,id,second_name,phone_number
ram,727,prakash,96
hari,872,pallavi,98
anurag,456,aakash,87
Также: обратите внимание, что ваш "ожидаемый" результат неверен. Первое число должно быть 727, а не 728.
BEGIN { FS=OFS="," }
{
cmd = "echo '" $0 "' | tr '1234567890' '8728125870'"
new = ( (cmd | getline line) > 0 ? line : $1 )
close(cmd)
split(new,tmp)
for (i in tmp) {
if (i ~ /^(2|4)$/) {
$i = tmp[i]
}
}
print
}
Сохраните приведенный выше код в файле test.awk и выполните, используя -> awk -f test.awk datanew.csv