0
|
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
|