Advertisement
shinemic

base_count.sh

Jul 13th, 2022 (edited)
1,157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.57 KB | None | 0 0
  1. #! /usr/bin/bash
  2.  
  3. op_perl0() {
  4.     perl -lnE '
  5.        BEGIN{ say "filename A G C T N" }
  6.        unless (($. + 2) % 4) {
  7.            $i = 0;
  8.            ++$b{$c} while ($c=substr($_, $i++, 1));
  9.            # s/(.)/++$b{$1}/ge;
  10.  
  11.            # for ($i = 0; $i < length; $i++) {
  12.            #     ++$b{substr($_, $i, 1)}
  13.            # }
  14.        }
  15.        $,=" ", say($c, @b{A,G,C,T,N}), $c=$ARGV, undef %b if (eof() || (($c//=$ARGV) ne $ARGV))
  16.    ' *.fastq | column -t -o ' | '
  17. }
  18.  
  19. op_perl1() {
  20.     perl -lnE '
  21.        BEGIN{ say "filename A G C T N" }
  22.        map {++$b{$_}} split// unless ($.+2)%4;
  23.        $,=" ", say($c, @b{A,G,C,T,N}), $c=$ARGV, undef %b if (eof() || (($c//=$ARGV) ne $ARGV))
  24.    ' *.fastq | column -t -o ' | '
  25. }
  26.  
  27. op_perl2() {
  28.     perl -lE '
  29.        BEGIN {say "filename A G C T N"}
  30.        while ($f = shift) {
  31.            %b = ();
  32.            open(F, $f) and @d = <F>;
  33.            for ($i = 1; $i <= $#d; $i += 4) {
  34.                map {++$b{$_}} split //, $d[$i];
  35.            }
  36.            $,=" ", say $f, @b{A, G, C, T, N};
  37.        }
  38.    ' *.fastq | column -t -o ' | '
  39. }
  40.  
  41. op_python() {
  42.     python -c 'print("filename A G C T N") or [
  43.        (c := __import__("collections").Counter())
  44.        or [[
  45.            c.update(d.strip())
  46.            for i, d in enumerate(open(f).readlines()) if i % 4 == 1
  47.        ],
  48.            print(f, " ".join(str(c[k]) for k in "AGCTN"))]
  49.        for f in __import__("sys").argv[1:]
  50.    ]
  51.    ' *.fastq | column -t -o ' | '
  52. }
  53.  
  54. op_pipeline() {
  55.     {
  56.         echo filename A G C T N
  57.         for f in *.fastq; do
  58.             sed -n '2~4p' $f | grep -o . | sort | uniq -c | \
  59.                 sort -k2 | awk 'BEGIN{printf "'$f' "} {print $1}' | tr '\n' ' '
  60.             echo
  61.         done
  62.     } | awk '{print $1, $2, $4, $3, $6, $5}' | column -t -o ' | '
  63. }
  64.  
  65. op_awk() {
  66.     awk '
  67.        BEGIN{
  68.            print "filename A G C G N"
  69.            for (fn = 1; fn < ARGC; fn++) {
  70.                ln = 0
  71.                while ((getline line < ARGV[fn]) > 0) {
  72.                    if (++ln % 4 == 2) {
  73.                        len = length(line)
  74.                        for (i = 1; i <= len; i++)
  75.                            ++count[substr(line, i, 1)];
  76.                    }
  77.                }
  78.                print ARGV[fn], count["A"], count["G"], count["C"], count["T"], count["N"]
  79.                close(ARGV[fn])
  80.                delete count
  81.            }
  82.        }
  83.    ' *.fastq | column -t -o ' | '
  84. }
  85.  
  86. op_bash() {
  87.     {
  88.         echo filename A C G N T
  89.         for f in *.fastq; do
  90.             declare -A alphaCount
  91.             lineNumber=0
  92.  
  93.             while IFS= read -r line; do
  94.                 if [[ $(($((lineNumber++)) % 4)) = 1 ]]; then
  95.                     for (( i=0; i<${#line}; i++ )); do
  96.                         alphaCount["${line:$i:1}"]=$((${alphaCount["${line:$i:1}"]:-0}+1))
  97.                    done
  98.                fi
  99.            done < $f
  100.  
  101.            echo "$f ${alphaCount[A]} ${alphaCount[G]} ${alphaCount[C]} ${alphaCount[T]} ${alphaCount[N]}"
  102.  
  103.            unset alphaCount
  104.        done
  105.    } | column -t -o ' | '
  106. }
  107.  
  108. op_tcl() {
  109.    {
  110.        tclsh /dev/stdin *.fastq <<'EOF'
  111.        puts "filename A G C T N"
  112.  
  113.        foreach filename $argv {
  114.            set fh [open $filename]
  115.            set line_number 0
  116.            set counter [dict create]
  117.  
  118.            while {[gets $fh line] >= 0} {
  119.                if {[expr $line_number % 4 == 1]} {
  120.                    foreach letter [split $line ""] {
  121.                        dict incr counter $letter
  122.                    }
  123.                }
  124.                incr line_number
  125.            }
  126.            # close $fh
  127.  
  128.            puts -nonewline "$filename"
  129.  
  130.            foreach letter [split AGCTN ""] {
  131.                puts -nonewline " [dict get $counter $letter]"
  132.            }
  133.  
  134.            puts ""
  135.        }
  136. EOF
  137.    } | column -t -o ' | '
  138. }
  139.  
  140. timeit() {
  141.    start_time="$(date -u +%s.%N)"
  142.    $@
  143.    end_time="$(date -u +%s.%N)"
  144.    elapsed="$(bc <<<"$end_time-$start_time")"
  145.    printf "eplapsed time: %.3fs\n" $elapsed
  146. }
  147.  
  148. echo 'perl0:' && timeit op_perl1 && echo
  149. echo 'perl1:' && timeit op_perl1 && echo
  150. echo 'perl2:' && timeit op_perl2 && echo
  151. echo 'python:' && timeit op_python && echo
  152. echo 'awk:' && timeit op_awk && echo
  153. echo 'tcl:' && timeit op_tcl && echo
  154. echo 'pipeline:' && timeit op_pipeline && echo
  155. echo 'bash:' && timeit op_bash
  156.  
  157. # python:   1.553s
  158. # perl2:    3.242s
  159. # perl0:    3.335s
  160. # perl1:    3.354s
  161. # awk:      4.512s
  162. # tcl:      17.465s
  163. # pipeline: 19.209s
  164. # bash:     667.201s
  165.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement