2017-08-23 1 views
0

Ich möchte nur die zweite Spalte der Daten maskieren.Unix redact data

Eingang:

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

Ausgang Erwartet:

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

Vinay, in Ihrer erwarteten Ausgabe verwendeten Sie eine Anzahl von Sternchen, die gleich der Länge von "second_name" ist. Ist dies Ihr gewünschtes Verhalten oder können Sie, wie in einigen Antworten angenommen, eine feste Anzahl von Sternchen akzeptieren? Ich muss hinzufügen, dass, wenn Sie die Daten verschleiern möchten, eine feste Anzahl von Sternchen eine bessere Wahl sein könnte. – gboffi

+0

* sollte auf der Länge dieses Feldes basieren. – vinay24

+0

Das Ändern Ihrer Frage in einer grundlegenden Weise, die * alle * aktuellen Antworten ungültig macht, wird als schlechte Form angesehen. Eine neue Frage sollte als neue Frage gestellt werden. – paxdiablo

Antwort

2

Das sed Programm dies tut, wird gut:

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

Die 2,$ nur auf den Linien 2 bis zum Ende der Datei arbeitet ((nur die Kopfzeile zu belassen) und der Ersatzbefehl s/,[^,]*,/,*****,/ ersetzt alles zwischen dem ersten und zweiten Komma mit der Maske *****.


Bitte beachte, dass ich speziell eine Fest verwendet haben Anzahl der Sterne in der Ersatzzeichenfolge. Ob Sie Passwörter verstecken oder Daten anonymisieren (wie es hier der Fall zu sein scheint), möchten Sie nicht irgendwelche Informationen lecken, einschließlich der Größe der Namen ersetzt werden.


Wenn Sie wirklich die gleiche Anzahl von Zeichen wie in den ursprünglichen Daten verwenden wollen, und Sie wollen auch die Möglichkeit des Ersatzes mehr Felder gerecht zu werden, können Sie so etwas wie verwenden:

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

verlassen wird auch die erste Zeile unangetastet aber anonymisieren Spalten zwei und vier (wenn auch mit dem Informationsleck bereits erwähnt):

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

Mehrere Spalten mit voll Anonymisierung würde die Verwendung von $2="*****" anstelle der gsub (für beide Spalten natürlich) führen.

+0

Sie geben der Grund, warum Sie die OP-Anfrage geändert haben, indem Sie eine feste Ersatzzeichenfolge verwenden. Upvoted – gboffi

+0

Vielen Dank für die Antwort. – vinay24

1

Eine weitere in awk. Mit gsub auf jedes Zeichen in $2 mit einem * ersetzen:

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

hallo james, ich möchte die 2. und 4. Spalte maskieren – vinay24

+0

@ vinay24 Sie haben nur 3 Spalten, die vierte ist automatisch maskiert, nicht wahr? – gboffi

+0

Wenn Sie die vierte ebenfalls maskieren möchten, fügen Sie '' gsub (/./,"*",$ 4) 'nach der ersten' gsub' hinzu, d. 'awk 'BEGIN {FS = OFS =", "} NR> 1 {gsub (/./,"*",$ 2); gsub (/./,"*",$ 4)} 1' Datei' –

0

versuchen Sie es auch einmal und lassen Sie mich wissen, ob dies Ihnen hilft.

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