[3] | 1 | #!/bin/sh |
---|
| 2 | |
---|
| 3 | # Version 0.1 , 15aug08 |
---|
| 4 | # Written by Assaf Gordon (gordon@cshl.edu) |
---|
| 5 | # |
---|
| 6 | |
---|
| 7 | LINES="$1" |
---|
| 8 | INFILE="$2" |
---|
| 9 | OUTFILE="$3" |
---|
| 10 | |
---|
| 11 | if [ "$LINES" == "" ]; then |
---|
| 12 | cat >&2 <<EOF |
---|
| 13 | Remove Ending Lines |
---|
| 14 | |
---|
| 15 | Usage: $0 LINES [INFILE] [OUTFILE] |
---|
| 16 | |
---|
| 17 | LINES - number of lines to remove from the end of the file |
---|
| 18 | [INFILE] - input file (if not specified - defaults to STDIN) |
---|
| 19 | [OUTFILE]- output file (if not specified - defaults to STDOUT) |
---|
| 20 | |
---|
| 21 | Input Example: |
---|
| 22 | |
---|
| 23 | #Chr Start End |
---|
| 24 | chr1 10 15 |
---|
| 25 | chr1 40 20 |
---|
| 26 | chr1 21 14 |
---|
| 27 | total 3 chromosomes |
---|
| 28 | |
---|
| 29 | Removing 1 line (the last line) produces: |
---|
| 30 | |
---|
| 31 | #Chr Start End |
---|
| 32 | chr1 10 15 |
---|
| 33 | chr1 20 40 |
---|
| 34 | chr 14 21 |
---|
| 35 | |
---|
| 36 | Usage Example: |
---|
| 37 | |
---|
| 38 | \$ $0 1 < my_input_file.txt > my_output_file.txt |
---|
| 39 | |
---|
| 40 | EOF |
---|
| 41 | |
---|
| 42 | exit 1 |
---|
| 43 | fi |
---|
| 44 | |
---|
| 45 | #Validate line argument - remove non-digits characters |
---|
| 46 | LINES=${LINES//[^[:digit:]]/} |
---|
| 47 | |
---|
| 48 | #Make sure the line strings isn't empty |
---|
| 49 | #(after the regex above, they will either contains digits or be empty) |
---|
| 50 | if [ -z "$LINES" ]; then |
---|
| 51 | echo "Error: bad line value (must be numeric)" >&2 |
---|
| 52 | exit 1 |
---|
| 53 | fi |
---|
| 54 | |
---|
| 55 | # Use default (stdin/out) values if infile / outfile not specified |
---|
| 56 | [ -z "$INFILE" ] && INFILE="/dev/stdin" |
---|
| 57 | [ -z "$OUTFILE" ] && OUTFILE="/dev/stdout" |
---|
| 58 | |
---|
| 59 | #Make sure the input file (if specified) exists. |
---|
| 60 | if [ ! -r "$INFILE" ]; then |
---|
| 61 | echo "Error: input file ($INFILE) not found!" >&2 |
---|
| 62 | exit 1 |
---|
| 63 | fi |
---|
| 64 | |
---|
| 65 | |
---|
| 66 | # The "gunzip -f" trick allows |
---|
| 67 | # piping a file (gzip or plain text, real file name or "/dev/stdin") to sed |
---|
| 68 | gunzip -f <"$INFILE" | sed -n -e :a -e "1,${LINES}!{P;N;D;};N;ba" > "$OUTFILE" |
---|
| 69 | |
---|