From: Steven Baltakatei Sandoval <baltakatei@gmail.com>
Date: Tue, 7 Mar 2023 21:32:55 +0000 (+0000)
Subject: feat(unitproc/get_rand_line):Bash script that gets random line
X-Git-Tag: 0.8.2~10
X-Git-Url: https://zdv2.bktei.com/gitweb/BK-2020-03.git/commitdiff_plain/62f23c25753db3b522cf9697e2452ae943c56594?ds=sidebyside

feat(unitproc/get_rand_line):Bash script that gets random line
---

diff --git a/unitproc/get_rand_line b/unitproc/get_rand_line
new file mode 100755
index 0000000..166d419
--- /dev/null
+++ b/unitproc/get_rand_line
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+# Desc: Gets random line from a newline-delimited file
+# Usage: get_rand_line [path FILE]
+# Version: 0.0.1
+
+yell() { echo "$0: $*" >&2; } # print script path and all args to stderr
+die() { yell "$*"; exit 111; } # same as yell() but non-zero exit status
+must() { "$@" || die "cannot $*"; } # runs args as command, reports args if command fails
+get_rand_line() {
+    # Input: arg1 : file path
+    #        stdout: random line from input file
+    # Usage: get_rand_line [path FILE]
+    # Depends: GNU Coreutils 8.32 (shuf)
+    
+    # Check if file
+    if [[ ! -f "$1" ]]; then die "FATAL:Not a file:$1"; fi;
+    if [[ $# -ne 1 ]]; then die "FATAL:Incorrect argument count:$1"; fi;
+
+    # Get line count
+    lc="$(wc -l "$1" | awk '{print $1}')";
+
+    # Calc random line number (zero-indexed)
+    ln="$(shuf -i 0-"$((lc - 1))" -n1)";
+
+    n=0;
+    while read -r line; do
+        # Check if line is target line
+        if [[ $n -eq $ln ]]; then
+            printf "%s\n" "$line"; # output
+        fi;
+        ((n++));
+    done < "$1";
+}; # Returns random line from newline-delimited file
+main() {
+    get_rand_line "$@";
+};
+
+main "$@";