unix中的数据函数

Data functions in 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

第 1 步:

生成一个随机数用于替换。这是用类似于 $(($RANDOM * 32768 + $RANDOM)) 的东西完成的;如果您需要更多详细信息,请告诉我。

第 2 步:

使用tr将所有号码替换为它们的"capital"版本,并用您需要的号码替换它们。因此,对于您的示例,要仅替换 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

另外:请注意您的 "expected" 输出是如何不正确的。第一个数字应该是 727,而不是 728。

 BEGIN { FS=OFS="," }
    {
      cmd = "echo '" [=10=] "' | tr '1234567890' '8728125870'"
      new = ( (cmd | getline line) > 0 ? line :  )
      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

执行