2017-08-23 5 views
0

データの2番目の列のみをマスクしたい。Unix redactデータ

入力:

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 
+0

Vinay、予想される出力では、 "second_name"の長さに等しい数のアスタリスクを使用しました。これはあなたの要求された動作ですか、あるいはいくつかの回答で仮定されているように、アスタリスクの固定数を受け入れることができますか?私はそれを追加しなければならない、データを難読化したいならば、アスタリスクの固定数がより良い選択かもしれない。 – gboffi

+0

*は、そのフィールドの長さに基づいていなければなりません。 – vinay24

+0

*すべての*現在の回答を無効にする基本的な方法であなたの質問を変更することは悪い形とみなされます。新しい質問として新しい質問をする必要があります。 – paxdiablo

答えて

2

sedプログラムがうまくこれを行います。

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

2,$は(ファイルの最後までライン2上で動作しますヘッダー行だけを残す)、代替コマンドs/,[^,]*,/,*****,/は、最初のカンマと第2のカンマの間のものをマスク*****に置き換えます。私は、具体的置換文字列にアスタリスクの固定番号を使用しました


注意。パスワードや匿名化データを隠していても(この場合のように)、の情報は、置き換えられる名前のサイズなど、の情報に漏れたくありません。


あなたがのようなものを使用することができ、あなた本当には、元のデータのように文字の同じ番号を使用したい、とあなたはまた、複数のフィールドを置き換えるの可能性に対応するためにしたい場合:

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

これもそのまま最初の行を残すであろうが、(前述した情報の漏洩を持つにもかかわらず)の列2および4を匿名化されます。

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,***** 

複数の列をで完全に匿名化する場合は、gsubではなく$2="*****"を使用する必要があります(両方の列について)。

+0

OP要求から変更した理由は、固定の置換文字列を使用しています。 Upvoted – gboffi

+0

お返事ありがとうございました。 – vinay24

1

別のawkインチ*$2内のすべての文字を置き換えるためにgsubを使用した:

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

こんにちはジェームズ、私は第2列と第4列をマスクしたい – vinay24

+0

@ vinay24あなたは3列しか持っていません.4列目は自動的にマスクされますね。 – gboffi

+0

4番目のマスクもマスクしたい場合は、最初の 'gsub'の後に'; gsub(/./,"*"$$ 4) 'を追加します。 'awk 'BEGIN {FS = OFS ="、 "} NR> 1 {gsub(/./,"*"$$ 2); gsub(/./,"*" $ 4)} 1'ファイル ' –

0

次回以降にお試しください。これが役立つかどうか教えてください。

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