Функции данных в 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

Другие вопросы по тегам