Masking Bank Account Number except last 4 digits in the file


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Masking Bank Account Number except last 4 digits in the file
# 1  
Old 09-11-2018
Masking Bank Account Number except last 4 digits in the file

Hello Unix Guru's,

I need help in the masking Bank Account Number except last 4 digits in the file using either unix command or shell script.

I'm greatly appreciate your help.
Code:
File Name: Sample.txt
560|101012|4267||||||||520114025017|Balance_bank|06/30/2018||||151716.41|AUD
448|101034|3148||||||||232041005|Balance_bank|06/30/2018||||991.23|AUD
270|101034|2770||||||||121339005|Balance_bank|06/30/2018||||594217.11|AUD

Modified File Should be like below
Code:
560|101012|4267||||||||XXXXXXXX5017|Balance_bank|06/30/2018||||151716.41|AUD
448|101034|3148||||||||XXXXX1005|Balance_bank|06/30/2018||||991.23|AUD
270|101034|2770||||||||XXXXX9005|Balance_bank|06/30/2018||||594217.11|AUD


Last edited by jim mcnamara; 09-11-2018 at 10:45 AM..
# 2  
Old 09-11-2018
Welcome to the forum.


Any attempts / ideas / thoughts from your side?
This User Gave Thanks to RudiC For This Post:
# 3  
Old 09-11-2018
I know how to do it in Oracle (like below), however client need in shell script.
Code:
select length('520114025017'),
                  '520114025017'  bank_account_number,      
 lpad(substr('520114025017',length('520114025017')-3,length('520114025017')),9,'X')
          from dual;

Thanks,
Pradeep

Last edited by Scott; 09-11-2018 at 04:28 PM.. Reason: ICODE to CODE tags
# 4  
Old 09-11-2018
Here is a hack with sed.
Code:
sed -e ':L' -e 's/\(\([^|]*|\)\{10\}X*\)[0-9]\([0-9]\{4\}\)/\1X\3/;tL' sample.txt

The \(\([^|]*|\)\{10\}X*\) matches the first 10 fields plus already substituted Xes in field 11, and is put back as \1.
The 4 digit look-ahead \([0-9]\{4\}\) is put back as \3.
The one [0-9] is really substituted by the X.
The whole thing repeats in a loop, until nothing is left that can be substituted. (A /g option does not work because it cannot repeat on anything before the last matched character i.e. the look-ahead.)
A solution with awk or perl or bash would look simpler, because you can split on "|" and only work on field 11.
# 5  
Old 09-12-2018
Quote:
Originally Posted by Pradeep R
I know how to do it in Oracle (like below), however client need in shell script.
Depending on what the rest of the shell script looks like (and, most prominently, WHICH SHELL YOU ARE USING - you might have considered telling us) you can do it with variable expansion. Here is a solution in Korn shell, i haven't tested it in bash,but it should work there too (replace "print" with "echo" then):

Code:
#! /bin/ksh

function maskpart
{
mask="${1%????}"                # extract everything save for the last 4 digits
mask="${mask//?/x}"             # and replace all characters with x's

print - "${mask}${1#${1%????}}" # print the masked part and the last 4 digits

return 0
}

# here are examples of how to use the function:
maskpart "123456-7890"
maskpart "blafoo1234"

myvar="$(maskpart "123456-7890")" ; print - $myvar

while read BAN ; do
     printf "$BAN \t==> " ; maskpart "$BAN"
done < /file/with/bank-account-numbers
exit 0

The function does not cover for bank-account-numbers being 4 digits or shorter (or otherwise malformed). If this could be the case you will have to provide extra logic.

I hope this helps.

bakunin
These 2 Users Gave Thanks to bakunin For This Post:
# 6  
Old 09-12-2018
Here a solution using Zsh. Assuming that you have stored your bank acount number into a variable called 'number', i.e.

Code:
number=123456789

you can get your number with the X by

Code:
xnumber=${${number:0:$((${#number}-4))}//?/X}${number:$((${#number}-4)):4}

# 7  
Old 09-12-2018
Here comes a bash script, using a short version of bakunin's function and a print function. (The shell is lacking a builtin join function. Gives me the chance to demonstrate the power of a custom function.)
Code:
#!/bin/bash

sep="|"

maskpart(){
  local mask="${1%????}"
  echo "${mask//?/X}${1#$mask}"
}

joinprint(){
  local a s=$1 out=$2
  shift 2
  for a
  do
    out=$out$s$a
  done
  echo "$out"
}

while IFS=$sep read -a arr
do
  arr[10]=$(maskpart "${arr[10]}")
  joinprint "$sep" "${arr[@]}"
done


Last edited by MadeInGermany; 09-12-2018 at 06:20 AM..
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Post Here to Contact Site Administrators and Moderators

Verify from one account number to another account number

Hi, Can anyone suggest me for the below steps. Here the index files is nothing but a text file and In index file there are n number of pdf files. Step 0 check out if this is for A(index file) or B(index file) 1. Read the first line of the original index file 2. Read the 9th character... (1 Reply)
Discussion started by: pavand
1 Replies

2. Shell Programming and Scripting

Find number of digits in a word

HI, Can you tell me how to find the number of digits in a word. $cat data.txt +123456ad 87645768 Output should be 6 8 (5 Replies)
Discussion started by: ashwin3086
5 Replies

3. Shell Programming and Scripting

awk changes to cut number of digits

HCPM1ONDB00014800011800000589009211201 L201307022013070228AUD 00000000031. 000965105800000000000000000000000 MOBITV KEYA ... (4 Replies)
Discussion started by: mirwasim
4 Replies

4. Shell Programming and Scripting

extracting Number variable and the following digits.

HI all, I have output of something like this: crab: ExitCodes Summary >>>>>>>>> 12 Jobs with Wrapper Exit Code : 50117 List of jobs: 1-12 See https:///twiki/something/ for Exit Code meaning crab: ExitCodes Summary >>>>>>>>> 5 Jobs with Wrapper Exit Code : 8001 List of... (20 Replies)
Discussion started by: emily
20 Replies

5. Shell Programming and Scripting

summing the digits of a binary nuMBER

please help me write a perl program to find the difference of 1 and zeros of a 6 digit binary number. eg If input is 111100 expected output +2 if input is 000011 expected output -2 input is 000111 expected output 0 (2 Replies)
Discussion started by: dll_fpga
2 Replies

6. Shell Programming and Scripting

number of digits after decimal

Hi All, I have a file of decimal numbers, cat file1.txt 1.1382666907 1.2603107334 1.6118799297 24.4995857056 494.7632588468 560.7633734425 ..... I want to see the output as only 7 digits after decimal (5 Replies)
Discussion started by: senayasma
5 Replies

7. Emergency UNIX and Linux Support

Masking of number

BAT:0310:2009-08-0:Y4 :H:D:00003721:03103721.IFH:00138770:05767:00000000001279' EXR:CLP:912.570000' STA:A:9071559:2009-08-10::Wer::Mrs' DEF::531.97:531.97:310221661617::+ABC:BAL:1:N::::5:40.00:0.00:2009-08-10:CN:1111111111109962::3:N:missc :N:PH:00010833:... (5 Replies)
Discussion started by: mad_man12
5 Replies

8. Shell Programming and Scripting

Count number of digits in a word

Hi all Can anybody suggest me, how to get the count of digits in a word I tried WORD=abcd1234 echo $WORD | grep -oE ] | wc -l 4 It works in bash command line, but not in scripts :mad: (12 Replies)
Discussion started by: ./hari.sh
12 Replies

9. UNIX for Advanced & Expert Users

restrain the number of digits of a PID

How is it possible under UNIX to restrain the number of digits of the PID number? For instance, we have a product that generates a PID of 7 digits, and we would like to have only 6 digits maximum instead for the PID. Thank you for your help. (1 Reply)
Discussion started by: mlefebvr
1 Replies
Login or Register to Ask a Question