More sed/awk help


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting More sed/awk help
# 1  
Old 07-02-2010
Question More sed/awk help

I was using the search button, but was unable to locate this specific example.

I'm looking to find a wildcard string and if found insert some extra string.

Here is the full string
Code:
<SCHED_TABLE DATACENTER="ctmwk05" TABLE_NAME="BPR-PP-CCR" USED_BY_CODE="0">

Any line in my XML file that has <SCHED_TABLE*TABLE_NAME="BPR-PP-CCR"
I want to insert TABLE_USERDAILY="UTC"

So the above would become

Code:
<SCHED_TABLE TABLE_USERDAILY="UTC" DATACENTER="ctmwk05" TABLE_NAME="BPR-PP-CCR" USED_BY_CODE="0">

I tried the following, but its not working out for me.

Code:
awk ' {if(/<SCHED_TABLE.TABLE_NAME="BPR-PP-CCR"/) { sed -e "s+<SCHED_TABLE+<SCHED_TABLE TABLE_USERDAILY=\"UTC\" " } else { print $0} } ' test.txt > test.new

In the meantime I'll keep searching the forums.
# 2  
Old 07-02-2010
Hi, you cannot mix awk and sed like that. If it is always on the same line then you could use this:
Code:
sed 's/\(<SCHED_TABLE \)\(.*TABLE_NAME="BPR-PP-CCR"\)/\1TABLE_USERDAILY="UTC" \2/' infile > outfile

This User Gave Thanks to Scrutinizer For This Post:
# 3  
Old 07-02-2010
The TABLE_NAME is used on many lines, but I only want to edit lines that have both SCHED_TABLE and that TABLE_NAME value.

Your sed command works great on my test file. I'll run it against a bigger test.

Thank you.
# 4  
Old 07-04-2010
Found an exception to the above I need to handle now.

The XML can have the following
Code:
<SCHED_TABLE DATACENTER="ctmwk05" TABLE_NAME="BPR-PP-CCR" USED_BY_CODE="0">
<JOB
NAME="x"
DATE="y"
OWNER="abc"
AUTHOR="me" >
</JOB>
<SCHED_GROUP 
DATACENTER="ctmwk05" 
TABLE_NAME="BPR-PP-CCR" 
USED_BY_CODE="0">
<JOB
NAME="x"
DATE="y"
OWNER="abc"
AUTHOR="me" >
</JOB>

So I can use the above find and insert, I want to merger the SHED_GROUP node to one line.

So if I find SCHED_GROUP, merge lines until I find the close ">". The above would become.

Code:
<SCHED_TABLE DATACENTER="ctmwk05" TABLE_NAME="BPR-PP-CCR" USED_BY_CODE="0">
<JOB
NAME="x"
DATE="y"
OWNER="abc"
AUTHOR="me" >
</JOB>
<SCHED_GROUP DATACENTER="ctmwk05" TABLE_NAME="BPR-PP-CCR" USED_BY_CODE="0">
<JOB
 NAME="x"
 DATE="y"
 OWNER="abc"
 AUTHOR="me" >
 </JOB>

# 5  
Old 07-04-2010
Try this:
Code:
awk '/<SCHED_GROUP/{p=1}/>/{p=0} {printf $0} !p{print ""}' infile

This User Gave Thanks to Scrutinizer For This Post:
# 6  
Old 07-04-2010
Thanks I'll try it out Monday morn.
# 7  
Old 07-06-2010
Ok so I wrote a function to fix up the XML

Code:
function scanInsertUD
{
#set -x
CTM_FILE=$1
TMP_FILE=/tmp/ud.$$

# Reformat XML file
# Remove developer added user daily
sed 's/TABLE_USERDAILY=".*"//g' ${CTM_FILE} > ${CTM_FILE}.tmp
mv ${CTM_FILE}.tmp ${CTM_FILE}
# Merge SCHED_GROUP XML node
#awk '/<SCHED_GROUP/{p=1}/>/{p=0} {printf $0} !p{print ""}' ${CTM_FILE} > ${CTM_FILE}.tmp
#mv ${CTM_FILE}.tmp ${CTM_FILE}

# Scan all possible tables that dont have a UD
grep "<SCHED_TABLE" ${CTM_FILE} | grep "TABLE_NAME" | sed -e 's/.*TABLE_NAME="//' | awk '{print $1}' > $TMP_FILE
grep "<SCHED_GROUP" ${CTM_FILE} | grep "TABLE_NAME" | sed -e 's/.*TABLE_NAME="//' | awk '{print $1}' >> $TMP_FILE

# Populates tmp file with BPR-PP-CCR"
cat ${TMP_FILE} | while read LINE
do
   # Prefix with TABLE_NAME="
   set -A TABLE_ARRAY ${TABLE_ARRAY[*]} "TABLE_NAME=\""$LINE
done
rm -f ${TMP_FILE} > /dev/null

((COUNT=0))
while (( ${COUNT} < ${#TABLE_ARRAY[*]} ))
do
   TABLE=$(echo ${TABLE_ARRAY[${COUNT}]})
   BDU=$(echo ${TABLE_ARRAY[${COUNT}]} | cut -d= -f2 | cut -d\" -f2)
   USR_DLY=$(grep $BDU ${etcbase:?}/userdaily.conf | cut -d: -f2)
   
   if [[ "${USR_DLY}" != "" ]]; then
      sed -e \
         's/\(<SCHED_TABLE \)\(.*'${TABLE}'\)/\1TABLE_USERDAILY="'${USR_DLY}'" \2/' -e \
         's/\(<SCHED_GROUP \)\(.*'${TABLE}'\)/\1TABLE_USERDAILY="'${USR_DLY}'" \2/' \
         < ${CTM_FILE} > ${CTM_FILE}.tmp
      mv ${CTM_FILE}.tmp ${CTM_FILE}

   fi
   
   ((COUNT=${COUNT}+1))
done

}

All the sed commands are fine. But when I added the awk line above (at line 10) It merges the lines, but additionally it drops % signs. So %% in the XML becomes %

Example
Code:
CMDLINE="rm %%L_BILL_EC_FP_AFT_SA/%%L_BILL_EC_FP_PAT_SA_TRG"

becomes after awk
CMDLINE="rm %L_BILL_EC_FP_AFT_SA/%L_BILL_EC_FP_PAT_SA_TRG"



---------- Post updated at 06:32 PM ---------- Previous update was at 06:13 PM ----------

I was thinking of using sed to stick it back in

Code:
sed 's/%/%%/g' infile

But I'm not sure if thats the best approach, since I don't know if anyone might have used a single % for another reason.

---------- Post updated at 11:11 PM ---------- Previous update was at 06:32 PM ----------

Note to anyone reading this for info

I wanted to remove one of my XML properties with this command

Code:
sed 's/TABLE_USERDAILY=".*"//g'

It would take

Code:
<SCHED_TABLE TABLE_USERDAILY="UTC" DATACENTER="ctmwk05" TABLE_NAME="BPR-PP-CCR" USED_BY_CODE="0">

And make it
<SCHED_TABLE >

When the intention was
<SCHED_TABLE DATACENTER="ctmwk05" TABLE_NAME="BPR-PP-CCR" USED_BY_CODE="0">

Deleting everything from the first quote to the very last quote "

The proper command, you have to ignore spaces in the pattern.

Code:
sed 's/TABLE_USERDAILY="[^ ]*"//g'


As for the other issue of

Code:
awk '/<SCHED_GROUP/{p=1}/>/{p=0} {printf $0} !p{print ""}' infile

Because printf sees % as a special variable

Code:
 printf
            Requires the following syntax:

            printf Format [ , ExpressionList ] [ Redirection ] [ Expression ]

            The printf statement writes to standard output the expressions specified by the ExpressionList parameter in the
            format specified by the Format parameter. The printf statement functions exactly like the printf command,
            except for the c conversion specification (%c). The Redirection and Expression parameters function the same as
            in the print statement.

Im not sure if I can find a sed command to do the same thing. But for now after I run awk I'm using sed to change % back to %%
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

sed and awk giving error ./sample.sh: line 13: sed: command not found

Hi, I am running a script sample.sh in bash environment .In the script i am using sed and awk commands which when executed individually from terminal they are getting executed normally but when i give these sed and awk commands in the script it is giving the below errors :- ./sample.sh: line... (12 Replies)
Discussion started by: satishmallidi
12 Replies

2. Shell Programming and Scripting

Is this possible using SED and AWK?

Dear Geeks, I want to manipulate a file with certain modifications for that using sed or AWK how to do this process for one file i have this type of data. Input File: "Restricted and Reserved names .ANISH",3798,"TEST.CO",1201208,6/16/10 0:00,6/16/13 0:00,,,"CO","2nd"^M "Restricted and... (4 Replies)
Discussion started by: anishkumarv
4 Replies

3. UNIX for Dummies Questions & Answers

sed/awk or help please

I have a file that contain the data below: B1 1 2 3 B2 20 30 40 B3 7 8 B4 100 B5 21 22 23How can I retrieve the data for B1 into a seperate file. (8 Replies)
Discussion started by: bobo
8 Replies

4. Shell Programming and Scripting

Need help using awk or sed.

Hi All, Is there a way of comparing two columns in the same file and deleting the row if the values of the columns match. I have the sample data file as below. M024900|175309.00|968.00|17 M025001|19861.79|97.90|148 M025002|431.70|159.00|3 M025003|912.30|159.90|6 ... (6 Replies)
Discussion started by: nua7
6 Replies

5. Shell Programming and Scripting

Using sed or awk?

What if I wanted to add a word such as IT after the first character and if theres 3 characters, after the 2nd character? output would be: G, it H G, H it P G, H, P it L I'm thinking that AWK would be the easiest way to do this... Currently looking it up. Right now I'm using awk but I... (13 Replies)
Discussion started by: puttster
13 Replies

6. UNIX for Dummies Questions & Answers

sed or awk?

I've got an inventory database with eight columns with things like product name, manufacturer, UPC code, etc. on each line. Our PO (purchase order) number is in the first column. I can grep the date and get the full line of data but I would like to strip out everything but the PO number in the... (5 Replies)
Discussion started by: NetJones
5 Replies

7. UNIX for Advanced & Expert Users

Awk or Sed help

Hi, I have a data file with 5 columns - like this: "20080401 09:43:08.770798 +0100s","TEST 1","R 1","A TEST","Nov 27 2007","1" "20080401 09:43:08.770798 +0100s","THIS IS A TEST","R 2","B TEST","Nov 30 2007","10" "20080401 09:43:08.770798 +0100s","ANOTHER TEST","R 3","B TEST","Nov 05... (7 Replies)
Discussion started by: MrG-San
7 Replies

8. UNIX for Advanced & Expert Users

sed in awk ? or nested awk ?

Hey all, Can I put sed command inside the awk action ?? If not then can i do grep in the awk action ?? For ex: awk '$1=="174" { ppid=($2) ; sed -n '/$ppid/p' tempfind.txt ; }' tempfind.txt Assume: 174 is string. Assume: tempfind.txt is used for awk and sed both. tempfind.txt... (11 Replies)
Discussion started by: varungupta
11 Replies

9. Shell Programming and Scripting

sed,awk

Hi, I know sed is stream text editor and not a bit more than that. Can anyone explain its usage and advantages? How is awk different from sed? I donno i am a bit confused about it. But i have coded in awk and shell. Thanks, Nisha :confused: (7 Replies)
Discussion started by: Nisha
7 Replies

10. Shell Programming and Scripting

awk / sed

I have many messages such as the test message below: 00:00000:00021:2002/05/13 13:57:00.51 ERROR:- Test error, my test error!!! I am writing a script in which I need to get everything from the word "ERROR:-" onwards. I normally use awk for these things, but I am not an expert at it so i am... (6 Replies)
Discussion started by: baileyr1
6 Replies
Login or Register to Ask a Question