【问题标题】:Unix redact dataUnix 编辑数据
【发布时间】:2017-08-23 22:42:04
【问题描述】:

我只想屏蔽数据的第二列。

输入:

 First_name,second_name,phone_number
 ram,prakash,96174535
 hari,pallavi,98888234
 anurag,aakash,82783784

预期输出:

 First_name,second_name,phone_number
 ram,*******,96174535
 hari,*******,98888234
 anurag,******,82783784

【问题讨论】:

  • Vinay,在您的预期输出中,您使用了一些等于“second_name”长度的星号。这是您要求的行为,还是按照某些答案的假设,您可以接受固定数量的星号?我必须补充一点,如果您想混淆数据,固定数量的星号可能是更好的选择。
  • * 应该基于该字段的长度。
  • 以基本方式更改您的问题,使 所有 当前答案无效被认为是错误的形式。应将新问题作为新问题提出。
  • @paxdiablo 公平地说,Vinay 一直根据姓氏的长度在不同的行中使用 7 星或 6 星,从他们问题的第一个版本(见编辑历史)开始。您可能会说答案写得不好,这正是您对提出第一个问题的人的期望,但我认为在这种情况下没有必要使用 bad form 一词。
  • @gboffi,尝试的更改是从仅屏蔽字段 2 到屏蔽字段 2 和 4(我回滚的更改,因为它使所有答案无效) - 这是我所指的根本变化(和我可能应该说得更清楚),而不是替换文本中的字符数。

标签: unix awk sed masking


【解决方案1】:

sed 程序可以很好地做到这一点:

sed '2,$s/,[^,]*,/,*****,/'

2,$ 仅在第 2 行到文件末尾运行(以单独保留标题行),替换命令 s/,[^,]*,/,*****,/ 将使用掩码 ***** 替换第一个和第二个逗号之间的任何内容。


请注意,我在替换字符串中专门使用了 固定 个星号。无论您是隐藏密码还是匿名数据(这里似乎就是这种情况),您都不想泄露任何信息,包括被替换名称的大小。


如果您真的想使用与原始数据中相同数量的字符,并且还想满足替换多个字段的可能性,您可以使用类似的东西:

awk -F, 'BEGIN{OFS=FS}NR==1{print;next}{gsub(/./,"*",$2);gsub(/./,"*",$4);print}'

这也将保持第一行不变,但将匿名第二列和第四列(尽管前面提到了信息泄漏):

echo 'First_name,second_name,phone_number,other
ram,prakash,96174535,abc
hari,pallavi,98888234,def
anurag,aakash,82783784,g
bob,santamaria,124,xyzzy' | awk -F, 'BEGIN{OFS=FS}NR==1{print;next}{gsub(/./,"*",$2);gsub(/./,"*",$4);print}'

First_name,second_name,phone_number,other
ram,*******,96174535,***
hari,*******,98888234,***
anurag,******,82783784,*
bob,**********,124,*****

使用 full 匿名处理多个列将需要使用 $2="*****" 而不是 gsub(当然对于两列)。

【讨论】:

  • 您使用固定替换字符串给出您从 OP 请求更改的原因。赞成
  • 非常感谢您的回答。
【解决方案2】:

awk 中的另一个。使用gsub$2 中的每个字符替换为*

$ awk 'BEGIN{FS=OFS=","}NR>1{gsub(/./,"*",$2)}1' file
First_name,second_name,phone_number
ram,*******,96174535
hari,*******,98888234
anurag,******,82783784

【讨论】:

  • 嗨詹姆斯,我想屏蔽第 2 列和第 4 列
  • @vinay24 你只有 3 列,第 4 列是自动屏蔽的,不是吗?
  • 如果你还想屏蔽第四个,在第一个gsub之后添加;gsub(/./,"*",$4),即。 awk 'BEGIN{FS=OFS=","}NR>1{gsub(/./,"*",$2);gsub(/./,"*",$4)}1' file
【解决方案3】:

也尝试关注一次,如果这对您有帮助,请告诉我。

awk -F"," 'NR>1{$2="*******"} 1' OFS=,   Input_file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多