Format column datas

I have some data like this:

4258092
TRXCODE     a   19 
CARDNBR     a   10
PINFLAG      a    6
FUISSUER    a   12
PRODUCT     a   24
STATE         n    1

I want out put this format:

<?xml version="1.0" encoding="GB2312"?>
<convGrp>
    <grpid>4258092</grpid>
    <script>
    <![CDATA[
        SET = FILL($TRXCODE  ,CHR(32),R,19)
        SET = FILL($CARDNBR  ,CHR(32),R,10)
        SET = FILL($PINFLAG   ,CHR(32),R,6)
        SET = FILL($FUISSUER ,CHR(32),R,12)
        SET = FILL($PRODUCT  ,CHR(32),R,24)
        SET = FILL($STATE      ,CHR(48),L,1)
    ]]>
    </script>
</convGrp>

what does this mean is: if the first column is char(a) set it right with space and length(acii 32)if the first column is number(n) set it left with 0and length(acii 48)
pls help! thank you !

try:

awk '
BEGIN {c["a"]="CHR(32),R,"; c["n"]="CHR(48),L,";}
NF==1 {
   print "<?xml version=\"1.0\" encoding=\"GB2312\"?>";
   print "<convGrp>";
   print "   <grpid>" $1 "</grpid>";
   print "   <script>";
   print "   <![CDATA[";
}
NF==3 && c[$2] {
   print "      SET = FILL($" $1 "," c[$2] $3 ")";
}
END {
   print "   ]]>";
   print "   </script>";
   print "</convGrp>";
}
' data
1 Like

thank you thank you very much! but what does c[] mean?

Hello hhdzhu,

Welcome to forums, hope you will enjoy learning and sharing knowledge here. Following may help you in same.

awk -vTAB="\t" -vTTAB="\t\t" -vparan=")" -vCHAR1="      ,CHR(48),L," -vCHAR="  ,CHR(32),R," -vSET="SET = FILL($" -vGRPID="<grpid>,</grpid>" -vSCRIPT="<script>,</script>" -vCOVGROUP="<convGrp>,</convGrp>" -vCDATA="<[CDATA[,]]>" 'BEGIN{print "<?xml version="1.0" encoding="GB2312"?>"} {split(GRPID, A,",");split(SCRIPT, B,",");split(COVGROUP, C,",");split(CDATA, D,",");if(NR==1){print C[1] ORS TAB A[1] $0 A[2] ORS TAB B[1];next} {if($2=="a"){Q=CHAR};if($2=="n"){Q=CHAR1};print TTAB D[1] ORS TTAB SET $1 Q $NF paran}}END{print TAB D[2] ORS "\t" B[2] ORS C[2]}'  Input_file
 

Output will be as follows.

<?xml version=1 encoding=?>
<convGrp>
        <grpid>4258092</grpid>
        <script>
                <[CDATA[
                SET = FILL($TRXCODE  ,CHR(32),R,19)
                <[CDATA[
                SET = FILL($CARDNBR  ,CHR(32),R,10)
                <[CDATA[
                SET = FILL($PINFLAG  ,CHR(32),R,6)
                <[CDATA[
                SET = FILL($FUISSUER  ,CHR(32),R,12)
                <[CDATA[
                SET = FILL($PRODUCT  ,CHR(32),R,24)
                <[CDATA[
                SET = FILL($STATE      ,CHR(48),L,1)
        ]]>
        </script>
</convGrp>
 

If you have any more requirements on same then please do let us know the sample Input_file and expected output with all conditions, hope this helps you.
EDIT: Adding a non-one liner form for solution on same now too.

awk -vTAB="\t" -vTTAB="\t\t" -vparan=")" -vCHAR1="      ,CHR(48),L," -vCHAR="  ,CHR(32),R," -vSET="SET = FILL($" -vGRPID="<grpid>,</grpid>" -vSCRIPT="<script>,</script>" -vCOVGROUP="<convGrp>,</convGrp>" -vCDATA="<[CDATA[,]]>" 'BEGIN{
                                                                        print "<?xml version="1.0" encoding="GB2312"?>"
                                                                 }
                                                                 {
                                                                        split(GRPID, A,",");
                                                                        split(SCRIPT, B,",");
                                                                        split(COVGROUP, C,",");
                                                                        split(CDATA, D,",");
                                                                        if(NR==1){
                                                                                        print C[1] ORS TAB A[1] $0 A[2] ORS TAB B[1];
                                                                                        next
                                                                                 }
                                                                 {
                                                                        if($2=="a"){
                                                                                        Q=CHAR
                                                                                   };
                                                                        if($2=="n"){
                                                                                        Q=CHAR1
                                                                                   };
                                                                        print TTAB D[1] ORS TTAB SET $1 Q $NF paran
                                                                 }
                                                                 }
                                                           END   {
                                                                        print TAB D[2] ORS "\t" B[2] ORS C[2]
                                                                 }
                                                           '   Input_file
 

Thanks,
R. Singh

1 Like

thank you for the help!