How to strip some characters before putting in array?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How to strip some characters before putting in array?
# 8  
Old 01-14-2015
Quote:
Originally Posted by disedorgue
Hello,
You can try (work with gawk --posix):
Code:
nawk 'gsub(/[s()]/,"") && NF == 3 {s[$1]=1;d[a++]=$3;next};{d[a++]=$1};END{while(i<a) if (!s[d[i++]]) print d[i-1] }' input-file

Thanks disedorgue.

would you please give me brief explanation about
Code:
 if (!s[d[i++]]) print d[i-1]

thanks again.

---------- Post updated at 11:10 AM ---------- Previous update was at 10:32 AM ----------

Quote:
Originally Posted by RavinderSingh13
Hello ken6503,

Could you please try following, it may help you.
Code:
awk 'FNR==NR{if(NF>1){A[$1]=$1;gsub(/s\(/,X,$NF);gsub(/\)$/,X,$NF);B[$NF]=$NF} else {gsub(/s\(/,X,$NF);gsub(/\)$/,X,$NF);B[$NF]=$NF}} END{for(j in A){delete B[j]}for(u in B){print B[u]}}' Input_file Input_file

Output will be as follows.
Code:
deptnm-ocode-00-dum
deptnm-appnm-ecode
deptnm-on-rundt-bp
deptnm-on-rundt-run
deptnm-appnm-ecode-dld
deptnm-ocode-30-ddd
deptnm-ocode-50-curcnt

EDIT: Adding a non one liner form for same.
Code:
awk 'FNR==NR{
                if(NF>1){
                                A[$1]=$1;
                                gsub(/s\(/,X,$NF);
                                gsub(/\)$/,X,$NF);
                                B[$NF]=$NF
                        }
                else    {
                                gsub(/s\(/,X,$NF);
                                gsub(/\)$/,X,$NF);
                                B[$NF]=$NF
                        }
             }
     END     {
                for(j in A){
                                delete B[j]
                           }
                for(u in B){
                                print B[u]
                           }
             }
    ' Input_file Input_file


Thanks,
R. Singh
Thanks R.Singh.

the code works.

I have some questions about this code.

1. what is the difference between "gsub(/s\(/,X,$NF)" and "gsub(/s\(/,"",$NF)"
2. Is it necessary to read the file twice? in the code, think it only execute NR==FNR.
I tried below code, the results are same

Code:
awk 'FNR==NR{if(NF>1){A[$1]=$1;gsub(/s\(/,X,$NF);gsub(/\)$/,X,$NF);B[$NF]=$NF} else {gsub(/s\(/,X,$NF);gsub(/\)$/,X,$NF);B[$NF]=$NF}} END{for(j in A){delete B[j]}for(u in B){print B[u]}}' Input_file

This User Gave Thanks to ken6503 For This Post:
# 9  
Old 01-14-2015
Quote:
Originally Posted by ken6503
Thanks R.Singh.
the code works.

I have some questions about this code.

1. what is the difference between "gsub(/s\(/,X,$NF)" and "gsub(/s\(/,"",$NF)"
2. Is it necessary to read the file twice? in the code, think it only execute NR==FNR.
I tried below code, the results are same

Code:
awk 'FNR==NR{if(NF>1){A[$1]=$1;gsub(/s\(/,X,$NF);gsub(/\)$/,X,$NF);B[$NF]=$NF} else {gsub(/s\(/,X,$NF);gsub(/\)$/,X,$NF);B[$NF]=$NF}} END{for(j in A){delete B[j]}for(u in B){print B[u]}}' Input_file

Hello Ken6503,

For 1st query:
gsub(/s\(/,X,$NF) means it will substitute strings (/ and \)with NULL value. (I have used \(/ because (,) are meta characters and to
tell awk not to take their special meaning and take characters as it is we use escape character \)

For 2nd query:
Thank you for pointing out same, Yes you are right we can we can read the file once also, so no need to put FNR==NR condition in it,
so code can be reduce to as follows.(Not tested in different scenarios)
Code:
awk '{if(NF>1){A[$1]=$1;gsub(/s\(/,X,$NF);gsub(/\)$/,X,$NF);B[$NF]=$NF} else {gsub(/s\(/,X,$NF);gsub(/\)$/,X,$NF);B[$NF]=$NF}} END{for(j in A){delete B[j]}for(u in B){print B[u]}}' Input_file

Output will be as follows.
Code:
deptnm-ocode-00-dum
deptnm-appnm-ecode
deptnm-on-rundt-bp
deptnm-on-rundt-run
deptnm-appnm-ecode-dld
deptnm-ocode-30-ddd
deptnm-ocode-50-curcnt

Thanks,
R. Singh

Last edited by RavinderSingh13; 01-14-2015 at 01:55 PM..
This User Gave Thanks to RavinderSingh13 For This Post:
# 10  
Old 01-14-2015
if (!s[d[i++]]) print d[i-1] print d[i-1] if hash s[d[i++]] doesn't exist.
s is array with hash index where hash is field 1.
d is array with number index and contains field 3.
I use array with number index to preserve entry order.
This User Gave Thanks to disedorgue For This Post:
# 11  
Old 01-14-2015
Try this nawk one-liner...
Code:
nawk -F"[()]" '{print $2}' file

Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Putting strings into positioning array in loop

i need to add 2 string variables into a positioning array , repeatedly - in loop. First string in $2, second to $3 then up to the desired count incrementing the "position". Using set -- alone does not increment the count so I end up with 2 variables in the array. How do I increment the... (7 Replies)
Discussion started by: annacreek
7 Replies

2. Shell Programming and Scripting

Need to strip control-A characters from a column in a file

Hi All, I currently have flat file with 32 columns. The field delimiter is cntl-A ( \x01). The file has been extracted from an oracle table using a datastage job. However, in the 6th field, the data contains additional control -A characters which came as a part of the table data. I need... (12 Replies)
Discussion started by: harsha1238
12 Replies

3. Shell Programming and Scripting

Taking information from a postgres sql query and putting it into a shell script array

I have a postgres sql statement that is the following: select age from students; which gives me the entries: Age --- 10 15 13 12 9 14 10 which is about 7 rows of data. Now what I would like to do with this is use a shell script to create an array age. As a results... (3 Replies)
Discussion started by: JSNY
3 Replies

4. Shell Programming and Scripting

Help awk/sed: putting a space after numbers:to separate number and characters.

Hi Experts, How to sepearate the list digit with letters : with a space from where the letters begins, or other words from where the digits ended. file 52087mo(enbatl) 52049mo(enbatl) 52085mo(enbatl) 25051mo(enbatl) The output should be looks like: 52087 mo(enbatl) 52049... (10 Replies)
Discussion started by: rveri
10 Replies

5. Shell Programming and Scripting

Strip First few Characters

I want to strip first few characters from each record until a proper datesamp is found. Request for getNextPage.................06/29/12 07:49:30 VVUKOVIC@67.208.166.131{7A805FEF76A62FCBB23EA78B5380EF95.tomcat1}TP-Processor14 LogExchUsage: ERROR:: isprof=false : exch=NSDQ output should be... (2 Replies)
Discussion started by: ratheeshjulk
2 Replies

6. Shell Programming and Scripting

Putting a character between two other characters?

I need to separate Pascal style identifiers (TheyLookLikeThis) into words separated by an underscore (_). I've tried sed 's//&_&/' but this won't work (obviously). I'd love some help. (4 Replies)
Discussion started by: Ilja
4 Replies

7. UNIX for Dummies Questions & Answers

Array with special Characters

Hi, I would write a shell script to execute a series of command. However, if the cmd contains "-" in the array. It fails to do so. I'd tried use ', " or \ but get the same result. Output: (1 Reply)
Discussion started by: donaldfung
1 Replies

8. Shell Programming and Scripting

create array holding characters from sring then echo array.

Hi, I wish to store $string1 in $string1array a character in each array element. Then i wish to echo the entire array to the screen so that it reads as the normal string again. I have been trying with the code below but does not work. Please help... To put string into array: ... (5 Replies)
Discussion started by: rorey_breaker
5 Replies

9. UNIX for Dummies Questions & Answers

Strip characters after the last "/"

Hi, Could anybody please guide how to strip all charaters after the last '/' from a string in a shell script. I have got few strings like "/tmp/oracle/oradata1/abc" or "/var/log/backup/bdfd" and I want to strip anything after the last "/" i.e "abc" and "bdfd" in my case. Thanks, Jamal (3 Replies)
Discussion started by: ahjaeasedqa
3 Replies
Login or Register to Ask a Question