awk search/replace specific field, using variables for regexp & subsitution then overwrite file | Unix Linux Forums | Shell Programming and Scripting

  Go Back    


Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

awk search/replace specific field, using variables for regexp & subsitution then overwrite file

Shell Programming and Scripting


Closed Thread    
 
Thread Tools Search this Thread Display Modes
    #1  
Old 09-21-2012
cyphex cyphex is offline
Registered User
 
Join Date: Jul 2010
Last Activity: 4 October 2013, 6:22 AM EDT
Posts: 3
Thanks: 3
Thanked 0 Times in 0 Posts
awk search/replace specific field, using variables for regexp & subsitution then overwrite file

Hello,
I'm trying the solve the following problem.
I have a file which I intend to use as a csv called master.csv
The columns are separated by commas.
I want to change the text on a specific row in either column 3,4,5 or 6 from xxx to yyy depending upon if column 1 matches a specified pattern.
The column to change (i.e. 3/4/5/6) is dependent upon the value of the variable in a nested loop
The awk statement is located within a nested loop of a parent loop. It will use the variable value from the parent loop for column 1 and the variable value from the nested loop for column 3/4/5/6.
Below is an example of the code:

Code:
 
#Update the CSV file
cat $USERDUMP |awk -F , '{print $1}' |sort -u |\
 while read username
 do
     for LOOP_LIST in $SERVER_LIST
     do
     grep $username $DATADUMP.$LOOP_LIST >> /dev/null 2>&1
     RET_CODE=$?
     if [[ $RET_CODE -eq 0  ]]
     then
          echo    "User $username exists on $LOOP_LIST"
          awk -F "," -v user=$username -v server=$LOOP_LIST '/$user/ {gsub(/$server/,"Yes"); print}' master.csv
     else
          echo "User $username does not have account on $LOOP_LIST"
     fi
     done
 done

I know there are a few problems with my awk statement:
firstly, When passing the variables to awk nothing is produced by the print command.
I have tried the above on the command line using fixed values and I get the output I require:

Code:
$ awk -F "," '/userA/ {gsub(/ServerA/,"Yes"); print }' master.csv
userA,comment,Yes,ServerB,ServerC,ServerD

However, this creates another problem as I want to edit the master csv file. I can't redirect the awk stdout to a temp file then move back because I'd lose all the other entries. The only workarounds I can see for this problem are:
a) using awk to print the entire list with the changes applied, then I can use temp file. I'm not sure this is even possible as it defys the point of using awk pattern matching to print specific columns/rows.
b) run sed -i within the awk command (i've been googling the syntax to this but can't find it).
Apologies that was long winded. If you want me to clarify anything please let me know.
In essence I want to know:
1) how to pass multiple variables to awk command and use them in an regular expression & subsitution
2) how to edit the master csv file
Any help/advice would be much appreciated
Sponsored Links
    #2  
Old 09-21-2012
msabhi's Avatar
msabhi msabhi is offline
Registered User
 
Join Date: Mar 2012
Last Activity: 2 November 2013, 1:26 AM EDT
Location: In books/UNIX.com
Posts: 177
Thanks: 16
Thanked 61 Times in 60 Posts

Code:
sed -i  "/$user/ s/$server/Yes/" master.csv_bkp

I would strongly recommend and i believe you would you use this on a backup file first and test..
The Following User Says Thank You to msabhi For This Useful Post:
cyphex (09-23-2012)
Sponsored Links
    #3  
Old 09-21-2012
elixir_sinari's Avatar
elixir_sinari elixir_sinari is offline Forum Advisor  
Gotham Knight
 
Join Date: Mar 2012
Last Activity: 16 July 2014, 3:22 PM EDT
Location: India
Posts: 1,412
Thanks: 100
Thanked 495 Times in 472 Posts
Please post:
1) sample of $USERDUMP ,
2) contents of $SERVER_LIST ,
3) sample of $DATADUMP.$LOOP_LIST (at least 1 file), and
4) sample output.

This will be very much helpful to people to provide an efficient solution to your problem.
The Following User Says Thank You to elixir_sinari For This Useful Post:
cyphex (09-23-2012)
    #4  
Old 09-23-2012
cyphex cyphex is offline
Registered User
 
Join Date: Jul 2010
Last Activity: 4 October 2013, 6:22 AM EDT
Posts: 3
Thanks: 3
Thanked 0 Times in 0 Posts
I used the sed code instead of the awk command and this has given me exactly what I wanted!
Thanks for the help guys
Sponsored Links
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Replace specific field on specific line sed or awk crownedzero Shell Programming and Scripting 14 11-27-2011 03:34 PM
awk how to replace specific field with new value setepo Shell Programming and Scripting 10 04-07-2011 10:17 AM
awk search and replace and overwrite file JamesByars Shell Programming and Scripting 3 01-05-2010 04:17 PM
using sed to replace a specific string on a specific line number using variables todd.cutting Shell Programming and Scripting 2 08-13-2009 09:40 PM
overwrite specific lines in a file csecnarf Shell Programming and Scripting 7 05-13-2008 11:01 AM



All times are GMT -4. The time now is 02:39 AM.