diff tools/unix_tools/remove_ending.sh @ 0:9071e359b9a3

Uploaded
author xuebing
date Fri, 09 Mar 2012 19:37:19 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/unix_tools/remove_ending.sh	Fri Mar 09 19:37:19 2012 -0500
@@ -0,0 +1,69 @@
+#!/bin/sh
+
+# Version 0.1 ,  15aug08
+# Written by Assaf Gordon (gordon@cshl.edu)
+#
+
+LINES="$1"
+INFILE="$2"
+OUTFILE="$3"
+
+if [ "$LINES" == "" ]; then
+	cat >&2 <<EOF 
+Remove Ending Lines
+
+Usage: $0 LINES [INFILE] [OUTFILE]
+
+   LINES - number of lines to remove from the end of the file
+   [INFILE] - input file (if not specified - defaults to STDIN)
+   [OUTFILE]- output file (if not specified - defaults to STDOUT)
+
+Input Example:
+
+#Chr	Start	End
+chr1	10	15
+chr1	40	20
+chr1	21	14
+total   3 chromosomes
+
+Removing 1 line (the last line) produces:
+
+#Chr	Start	End
+chr1	10	15
+chr1	20	40
+chr	14	21
+
+Usage Example:
+   
+   \$ $0 1 < my_input_file.txt > my_output_file.txt
+
+EOF
+	
+	exit 1
+fi
+
+#Validate line argument - remove non-digits characters
+LINES=${LINES//[^[:digit:]]/}
+
+#Make sure the line strings isn't empty
+#(after the regex above, they will either contains digits or be empty)
+if [ -z "$LINES" ]; then
+	echo "Error: bad line value (must be numeric)" >&2
+	exit 1
+fi
+
+# Use default (stdin/out) values if infile / outfile not specified
+[ -z "$INFILE" ] && INFILE="/dev/stdin"
+[ -z "$OUTFILE" ] && OUTFILE="/dev/stdout"
+
+#Make sure the input file (if specified) exists.
+if [ ! -r "$INFILE" ]; then
+	echo "Error: input file ($INFILE) not found!" >&2
+	exit 1
+fi
+
+
+# The "gunzip -f" trick allows
+# piping a file (gzip or plain text, real file name or "/dev/stdin") to sed 
+gunzip -f <"$INFILE" | sed -n -e :a -e "1,${LINES}!{P;N;D;};N;ba" > "$OUTFILE"
+