Awk cheatsheet

From Lolly's Wiki
Revision as of 20:34, 25 November 2021 by Lollypop (talk | contribs) (Text replacement - "<source " to "<syntaxhighlight ")
Jump to navigationJump to search

Cheatsheet

Functions

Bytes to human readable

<syntaxhighlight lang=awk> function b2h(value){

       # Bytes to human readable
       unit=1;
       while(value>=1024){
         unit++;
         value/=1024;
       }
       split("B,KB,MB,GB,TB,PB", unit_string, /,/);
       return sprintf("%.2f%s",value,unit_string[unit]);

} </source>

Binary to decimal

<syntaxhighlight lang=awk> function b2d(bin){

 len=length(bin);
 for(i=1;i<=len;i++){
   dec+=substr(bin,i,1)*2^(len-i);
 }
 return dec;

} </source>

Quicksort

This is not my code! It is taken from [here] maybe slightly modified cannot check, site is down. You can call it like this: qsort(array,1,length(array)); <syntaxhighlight lang=awk>

  1. BEGIN http://awk.info/?quicksort

function qsort(A, left, right, i, last) {

 if (left >= right)
   return;
 swap(A, left, left+int((right-left+1)*rand()));
 last = left;
 for (i = left+1; i <= right; i++)
   if (int(A[i]) < int(A[left]))
     swap(A, ++last, i)
 swap(A, left, last)
 qsort(A, left, last-1)
 qsort(A, last+1, right)

}

  1. Helper function to swap two elements of an array

function swap(A, i, j, t) {

       t = A[i]; A[i] = A[j]; A[j] = t

}

  1. END http://awk.info/?quicksort

</source>

Same for alphanumeric: <syntaxhighlight lang=awk>

  1. BEGIN http://awk.info/?quicksort

function qsort(A, left, right, i, last) {

 if (left >= right)
   return;
 swap(A, left, left+int((right-left+1)*rand()));
 last = left;
 for (i = left+1; i <= right; i++)
   if (int(A[i]) < int(A[left]))
     swap(A, ++last, i)
 swap(A, left, last)
 qsort(A, left, last-1)
 qsort(A, last+1, right)

}

  1. Helper function to swap two elements of an array

function swap(A, i, j, t) {

       t = A[i]; A[i] = A[j]; A[j] = t

}

  1. END http://awk.info/?quicksort

</source>

Test: <syntaxhighlight lang=awk> BEGIN {

 string="1524097359810345254";
 split(string,array_i,"");
 string="ThisIsAQsortExample";
 split(string,array_a,"");

}

  1. BEGIN http://awk.info/?quicksort

function qsort_i(A, left, right, i, last) {

 if (left >= right)
   return;
 swap(A, left, left+int((right-left+1)*rand()));
 last = left;
 for (i = left+1; i <= right; i++)
   if (int(A[i]) < int(A[left]))
     swap(A, ++last, i)
 swap(A, left, last)
 qsort_i(A, left, last-1)
 qsort_i(A, last+1, right)

} function qsort_a(A, left, right, i, last) {

 if (left >= right)
   return;
 swap(A, left, left+int((right-left+1)*rand()));
 last = left;
 for (i = left+1; i <= right; i++)
   if (A[i] < A[left])
     swap(A, ++last, i)
 swap(A, left, last)
 qsort_a(A, left, last-1)
 qsort_a(A, last+1, right)

}

  1. Helper function to swap two elements of an array

function swap(A, i, j, t) {

       t = A[i]; A[i] = A[j]; A[j] = t

} END {

 for(element in array_i)
   printf array_i[element];
 printf " ===qsort==> "
 qsort_i(array_i,1,length(array_i));
 for(element in array_i)
   printf array_i[element];
 print;
 for(element in array_a)
   printf array_a[element];
 printf " ===qsort==> "
 qsort_a(array_a,1,length(array_a));
 for(element in array_a)
   printf array_a[element];
 print;

}

</source> which outputs:

1524097359810345254 ===qsort==> 0011223344455557899
ThisIsAQsortExample ===qsort==> AEIQTaehilmoprssstx

Sort words inside braces (gawk)

Written for beautifying lines like <syntaxhighlight lang=mysql> GRANT SELECT (account_id, user, enable_imap, fk_domain_id, enable_virusscan, max_msg_size, from_authuser_only, id, time_start, changed_by, enable_spamblocker, onhold, time_end, archive, mailbox_quota) ON `mail_db`.`mail_account` TO 'user'@'172.16.16.16' </source>

This function: <syntaxhighlight lang=awk> function inner_brace_sort (rest, delimiter) {

 sorted="";
 while( match(rest,/\([^\)]+\)/) ) {
   sorted=sprintf("%s%s", sorted, substr(rest, 1, RSTART));
   inner=substr(rest, RSTART+1, RLENGTH-2); 
   rest=substr(rest, RSTART+RLENGTH-1, length(rest));
   split(inner, inner_a, delimiter);
   inner_l=asort(inner_a, inner_s);
   for(i=1; i<=inner_l; i++) {
     sorted=sprintf("%s%s", sorted, inner_s[i]);
     if(i<inner_l) sorted=sprintf("%s, ", sorted);
   }
   sorted=sprintf("%s", sorted);
 }
 return sorted""rest;

} </source> Sorts the fields inside the braces alphabetically and can be called like this: <syntaxhighlight lang=awk> /\(/ {

 print inner_brace_sort($0, ",[ ]*");

} </source>