【问题标题】:Data functions in unixunix 中的数据函数
【发布时间】:2018-02-01 03:22:39
【问题描述】:

我想打乱数据的第 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

【问题讨论】:

  • "Unix" 不是一种编程语言。你到底想怎么做?
  • 你是说 bash 吗?

标签: linux shell unix scripting scramble


【解决方案1】:

第 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'

注意:要获得所需的效果,您需要扩展上面的命令才能使其工作。多次运行 insted 会产生错误的结果。

上述命令的输出:

First_name,id,second_name,phone_number
 ram,727,prakash,96
 hari,872,pallavi,98
 anurag,456,aakash,87

另外:请注意您的“预期”输出不正确。第一个数字应该是 727,而不是 728。

【讨论】:

  • 嗨,亚历克斯,感谢您的回答。我不想要任何随机的方式。当我的数据中有 1234567890 个数字时,它们必须分别加扰到 8728125870。能否请您尝试提供完整的代码。
  • 好的,如果这符合您的要求,请告诉我。
【解决方案2】:
 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多