Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Print all elements in an array in AWK

I want to loop through all elements in an array in awk and print. The values are sourced from the file below:

Ala     A       Alanine
Arg     R       Arginine
Asn     N       Asparagine
Asp     D       Aspartic acid
Cys     C       Cysteine
Gln     Q       Glutamine
Glu     E       Glutamic acid
Gly     G       Glycine
His     H       Histidine
Ile     I       Isoleucine
Leu     L       Leucine
Lys     K       Lysine
Met     M       Methionine
Phe     F       Phenylalanine
Pro     P       Proline
Pyl     O       Pyrrolysine
Ser     S       Serine
Sec     U       Selenocysteine
Thr     T       Threonine
Trp     W       Tryptophan
Tyr     Y       Tyrosine
Val     V       Valine
Asx     B       Aspartic acid or Asparagine
Glx     Z       Glutamic acid or Glutamine
Xaa     X       Any amino acid
Xle     J       Leucine or Isoleucine
TERM    TERM    termination codon

I have tried this:

awk 'BEGIN{FS="\t";OFS="\t"}{if (FNR==NR) {codes[$1]=$2;} else{next}}END{for (key in codes);{print key,codes[key],length(codes)}}' $input1 $input2

And the output is always Cys C 27 and when I replace codes[$1]=$2 for codes[$2]=$1 I get M Met 27.

How can I make my code print out all the values sequentially? I don't understand why my code selectively prints out just one element when I can tell the array length is 27 as expected. (To keep my code minimal I have excluded code within else{next} - Otherwise I just want to print all elements from array codes while retaining the else{***} command)

According to How to view all the content in an awk array?, The syntax above should work. I tried it here echo -e "1 2\n3 4\n5 6" | awk '{my_dict[$1] = $2};END {for(key in my_dict) print key " : " my_dict[key],": "length(my_dict)}' and that worked well.

like image 778
GKibet Avatar asked Sep 14 '25 22:09

GKibet


1 Answers

With your shown samples and attempts please try following, written and tested in GNU awk.

awk '
BEGIN{
  FS=OFS="\t"
}
{
  codes[$1]=$2
}
END{
  for(key in codes){
     print key,codes[key],length(codes)
  }
}' Input_file

Will add detailed explanation and OP's misses too in few mins.

Explanation: Adding detailed explanation for above.

awk '                     ##Starting awk program from here.
BEGIN{                    ##Starting BEGIN section from here.
  FS=OFS="\t"             ##Setting FS and OFS as TAB here.
}
{
  codes[$1]=$2            ##Creating array codes with index of 1st field and value of 2nd field
}
END{                      ##Starting END block of this program from here.
  for(key in codes){      ##Traversing through codes array here.
     print key,codes[key],length(codes)  ##Printing index and value of current item along with total length of codes.
  }
}' Input_file             ##Mentioning Input_file name here.
like image 93
RavinderSingh13 Avatar answered Sep 17 '25 15:09

RavinderSingh13