Operations on a file with Deletion , Modification and Insertion of lines

Hi All ,

Given a file , I need to delete , modify and insert lines matching certain patterns in that file using shell scripting.

e.g. If a file FILE1 has following content :

CUST.ABC.DEF = CUST.ABC.DEF * CUST.ABC.DEF
PRINTF(CUST.ABC.DEF)
CUST.ABC.DEF =  mid(CUST.ABC.DEF,10.34)
PRINTF("HOWDY")
CUST.GHI.JKL = (CUST.ABC.DEF * MID(CUST.GHI.JKL,12,34)) + mid(CUST.ABC.DEF,10,34)
IF(CUST.ABC.DEF != CUST.GHI.JKL) THEN
PRINTF("CAME HERE")
CUST.GHI.JKL = CUST.GHI.JKL + 1
ENDIF

Then , I need to do following three modifications in the file FILE1:

1) I need to delete all lines with PRINTF statements.
2) I need to modify all instances of small "mid" word with capital "MID".
3) I need to insert a line containing "{" after line with IF statement.

I need to all above operations without reading file line by line to avoid performance issues because file may contain more than 10000 lines. And for the same reason, I want to avoid usage of temporary file.

Can anyone please suggest solution for stated problem ?

awk '/PRINTF/{print ""}/mid/{sub(/mid/,"MID")}/IF/{sub(/IF/,"IF\n\{")}/ENDIF/{sub/ENDIF/,"ENDIF\n\}")}1'

You have missed that you also require a "}" after an "ENDIF" So I have introduced it manually. seeing that you forgot it.

Regards.

gawk '!/PRINTF/{
    gsub("mid","MID")
    if($0~/IF/){
        flag=1
        print
        next
    }
    print
}
flag{ print "{" ;flag=0} ' file

And here's one way to do it with Perl:

$
$ cat f5
CUST.ABC.DEF = CUST.ABC.DEF * CUST.ABC.DEF
PRINTF(CUST.ABC.DEF)
CUST.ABC.DEF =  mid(CUST.ABC.DEF,10.34)
PRINTF("HOWDY")
CUST.GHI.JKL = (CUST.ABC.DEF * MID(CUST.GHI.JKL,12,34)) + mid(CUST.ABC.DEF,10,34)
IF(CUST.ABC.DEF != CUST.GHI.JKL) THEN
PRINTF("CAME HERE")
CUST.GHI.JKL = CUST.GHI.JKL + 1
ENDIF
$
$ perl -lne 'if (!/PRINTF/){s/mid/MID/g; print $_,/\bIF\b/ ? "\n{" : ""}' f5
CUST.ABC.DEF = CUST.ABC.DEF * CUST.ABC.DEF
CUST.ABC.DEF =  MID(CUST.ABC.DEF,10.34)
CUST.GHI.JKL = (CUST.ABC.DEF * MID(CUST.GHI.JKL,12,34)) + MID(CUST.ABC.DEF,10,34)
IF(CUST.ABC.DEF != CUST.GHI.JKL) THEN
{
CUST.GHI.JKL = CUST.GHI.JKL + 1
ENDIF
$
$

tyler_durden

How about sed:

sed '/PRINTF/d;s/mid/MID/g;/IF/a}' infile

Output:

CUST.ABC.DEF = CUST.ABC.DEF * CUST.ABC.DEF
CUST.ABC.DEF =  MID(CUST.ABC.DEF,10.34)
CUST.GHI.JKL = (CUST.ABC.DEF * MID(CUST.GHI.JKL,12,34)) + MID(CUST.ABC.DEF,10,34)
IF(CUST.ABC.DEF != CUST.GHI.JKL) THEN
}
CUST.GHI.JKL = CUST.GHI.JKL + 1
ENDIF
}

If you can use Python

#!/usr/bin/env python
for line in open("file"):
    if not "PRINTF" in line:
        line=line.rstrip()
        line=line.replace("mid","MID")
        if "IF" in line:
            print "%s\n%s" % ( line, "{")
            continue
        print line

output

$ ./python.py
CUST.ABC.DEF = CUST.ABC.DEF * CUST.ABC.DEF
CUST.ABC.DEF =  MID(CUST.ABC.DEF,10.34)
CUST.GHI.JKL = (CUST.ABC.DEF * MID(CUST.GHI.JKL,12,34)) + MID(CUST.ABC.DEF,10,34)
IF(CUST.ABC.DEF != CUST.GHI.JKL) THEN
{
CUST.GHI.JKL = CUST.GHI.JKL + 1
ENDIF
{