view .bash_extras @ 4:0c43040ab265

for 2026 MSc
author Henry S. Thompson <ht@inf.ed.ac.uk>
date Wed, 20 May 2026 17:21:34 +0100
parents 6c772ae7fce2
children 10dfd4feeaa0
line wrap: on
line source

# General-purpose environment variables and utility functions
# Recommended for inclusion in ${HOME}/.bashrc via
#  source /work/dc007/dc007/shared/.bash_extras
# Already sourced in singularity container _before_ bash is launched
# Note that $HOME (and therefore the meaning of ~ in paths) is
#  set to $W in the singularity container for convenience, as it is
#  assumed to be where you will spend most of your time

H=/home/dc007/dc007/${USER} # Only visible from login nodes
W=/work/dc007/dc007/${USER}

CCC=/work/dc007/shared/pod12/common_crawl
SHARED=/work/dc007/dc007/shared

PATH=$PATH:$HOME/.local/bin:$HOME/bin:$W/bin:$SHARED/bin

export H W CCC SHARED PATH

cu ()
{
    cvs update "$@" | egrep -v '^\?'
}

lss ()
{ 
    ls -F --color=auto -lS "$@" | { 
        read one;
        if [ -n "$one" -a "${one::5}" \!= "total" ]; then
            echo "$one";
        fi;
        cat
    }
}

ff ()
{
    pat=$1;
    shift;
    find . -iname "*$pat*" $@
}

typecat () 
{ 
    tt=$(type $1);
    case $tt in 
        *\ is\ hashed\ *)
            cat $(echo $tt | cut -f 4 -d ' ' | tr -d '()')
        ;;
        *\ is\ /*)
            cat $(echo $tt | cut -f 3 -d ' ' | tr -d '()')
        ;;
        *)
            type $1
        ;;
    esac
}

sus () 
{ 
    sort "$@" | uniq -c | sort -k1nr,1
}

uz () 
{ 
    igzip -dc "$@"  # only works under sing
}

function tot ()
{
    awk '{sum+=$1} END {printf "%u\n",sum}'
}

btot ()
{
    python3 -c 'import sys
multiCol = dostats = sample = False
c = ""
p = 0
q = None
d = 2
ssq = 0
while len(sys.argv)>1:
  if multiCol and sys.argv[1][0]!="-":
      p=1
      q=int(sys.argv.pop(1))
  elif sys.argv[1]=="-c":
    # add commas
    c = ","
    sys.argv.pop(1)
  elif sys.argv[1]=="-a":
    # do sum etc. for all columns [p]:q
    multiCol = True
    sys.argv.pop(1)
    try:
      q = int(sys.argv.pop(1))
    except IndexError:
      print("you must supply an N for multi-column")
      exit(1)
  elif sys.argv[1]=="-s":
    # include mean and sample stdev
    dostats = True
    sample = True
    sys.argv.pop(1)
  elif sys.argv[1]=="-p":
    # include mean and population stdev
    dostats = True
    sys.argv.pop(1)
  elif sys.argv[1]=="-d":
    sys.argv.pop(1)
    d=int(sys.argv.pop(1))
  else:
    break
n=0
if multiCol:
  w=q-p
  import numpy as np
  s=np.array([0]*w)
  n=np.array([0]*w)
  if dostats:
    ssq=np.array([0]*w)
else:
  s=0
  if dostats:
    ssq=0
    import math
for l in sys.stdin: # ["1 11\n","2 22\n"]:
  try:
    if multiCol:
      ll=l.split()[p:q]
      ii=np.array([(0 if i.startswith("NaN") else int(i)) for i in ll])
      s+=ii
      ssq+=ii*ii
      n+=np.array([(0 if i.startswith("NaN") else 1) for i in ll])
    else:
      if l[0]!="N":
        i=int(l)
        s+=i
        if dostats:
          ssq+=(i*i)
          n+=1
  except (NameError,ValueError) as e:
    print(l,e,file=sys.stderr)
if dostats:
  if multiCol:
    m=s/n
    var=(ssq/n)-pow(m,2)
    if sample:
      var=(n/(n-1))*var
    sd=pow(var,0.5)
  else:
    m=float(s)/float(n)
    var=(float(ssq)/float(n))-pow(float(m),2)
    if sample:
      var=(float(n)/float(n-1))*var
    sd=math.sqrt(var)
if dostats:
  if multiCol:
    print("\t".join(f"{i:{c}.{d}f}" for i in s))
    print("\t".join(f"{i:{c}.{d}f}" for i in m))
    print("\t".join(f"{i:{c}.{d}f}" for i in sd))
  else:
    print(f"{s:}\t{m:}\t{sd:}")
else:
  if multiCol:
    print("\t".join(f"{i:}" for i in s))
  else:
    print(f"{s:}")

' "$@"
}

headtail ()
{
case "$1" in -*)
 n="$1"
 shift
 ;;
 *) n="-10"
 ;;
esac
cat "$@" | { sed -u ${n:1}q ; echo === ; tail $n ; }
}

export -f cu lss ff typecat sus uz tot btot headtail