Murali
Murali

Reputation: 11

How to translate a column value in the file using awk with tr command in unix

Details:

Input file : file.txt

P123456789,COLUMN2
P123456790,COLUMN2
P123456791,COLUMN2

Expected output:

Z678999999,COLUMN2
Z678999995,COLUMN2
Z678999996,COLUMN2

If i try using a variable it is giving proper result.

(i.e) /tmp>echo "P123456789"|tr "0-9" "5-9"|tr "A-Z" "X-Z"
Z678999999

But if i do with awk command it is not giving result instead giving error:

/tmp>$ awk 'BEGIN { FS=OFS="," } { $1=echo $1|tr "0-9" "5-9"|tr "A-Z" "X-Z";$2="COLUMN2"); print }' /tmp/file.txt >/tmp/file.txt.tmp
awk: BEGIN { FS=OFS="," } { $1=echo $1|tr "0-9" "5-9"|tr "A-Z" "X-Z";$2="COLUMN2"); print }
awk:                                   ^ syntax error
awk: BEGIN { FS=OFS="," } { $1=echo $1|tr "0-9" "5-9"|tr "A-Z" "X-Z";$2="COLUMN2"); print }
awk:                                                  ^ syntax error
awk: BEGIN { FS=OFS="," } { $1=echo $1|tr "0-9" "5-9"|tr "A-Z" "X-Z";$2="COLUMN2"); print }
awk:                                                                             ^ syntax error

Can anyone help please?

Upvotes: 0

Views: 3883

Answers (3)

Steve
Steve

Reputation: 54532

Unfortunately, AWK does not have a built in translation function. You could write one like Ed Morton has done, but I would reach for (and highly recommend) a more powerful tool. Perl, for example, can process fields using the autosplit (-a) command switch:

-a turns on autosplit mode when used with a -n or -p. An implicit split command to the @F array is done as the first thing inside the implicit while loop produced by the -n or -p.

You can type perldoc perlrun for more details.

Here's my solution:

perl -F, -lane '$F[0] =~ tr/0-9/5-9/; $F[0] =~ tr/A-Z/X-Z/; print join (",", @F)' file.txt

Results:

Z678999999,COLUMN2
Z678999995,COLUMN2
Z678999996,COLUMN2

Upvotes: 1

Ed Morton
Ed Morton

Reputation: 204174

$ cat tst.awk
function tr(old,new,str,        oldA,newA,strA,i,j) {
    split(old,oldA,"")
    split(new,newA,"")
    split(str,strA,"")
    str = ""
    for (i=1;i in strA;i++) {
        for (j=1;(j in oldA) && !sub(oldA[j],newA[j],strA[i]);j++)
            ;
        str = str strA[i]
    }
    return str
}

BEGIN { FS=OFS="," }
{ print tr("P012345678","Z567899999",$1), $2 }

$ awk -f tst.awk file
Z678999999,COLUMN2
Z678999995,COLUMN2
Z678999996,COLUMN2

Upvotes: 1

Kent
Kent

Reputation: 195209

just do what you wanted, without changing your logic:

awk line:

awk -F, -v OFS="," '{ "echo \""$1"\"|tr \"0-9\" \"5-9\"|tr \"A-Z\" \"X-Z\"" |getline $1}7'

with your data:

kent$  echo "P123456789,COLUMN2
P123456790,COLUMN2
P123456791,COLUMN2"|awk -F, -v OFS="," '{ "echo \""$1"\"|tr \"0-9\" \"5-9\"|tr \"A-Z\" \"X-Z\"" |getline $1}7'                                                              
Z678999999,COLUMN2
Z678999995,COLUMN2
Z678999996,COLUMN2

Upvotes: 2

Related Questions