-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.awk
110 lines (102 loc) · 2.87 KB
/
script.awk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#! /usr/bin/awk -f
# STEP 1: give a good name to your script and change all the data in intialize_script()
# STEP 2: define required/optional parameters in load_options()
# STEP 3: write code after the 2nd XXXXXX line
function set_program_data(){
SCRIPTNAME="script.awk"
SCRIPTVERSION="1.0.1"
SCRIPTAUTHOR="peter@forret.com"
SCRIPTPURPOSE="Read data file 1 and filter it into data file 2"
SCRIPTURL="https://github.com/pforret/awk-boilerplate"
}
function load_options(){
# OPTIONS[i]="<name of option>|<description>|<default value>"
OPTIONS[1]="input|source file|"
OPTIONS[2]="output|result file|"
OPTIONS[3]="steps|number of steps|10"
OPTIONS[9]="verbose|more information on stderr|0"
OPTIONS[10]="silent|no information on stderr|0"
}
# don't edit between the XXXX lines
# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
function intialize_script(){
set_program_data()
load_options()
set_option_defaults()
printlevel=1
if(get_option("silent",silent) > 0) printlevel=0
if(get_option("verbose",verbose) > 0) printlevel=2
}
function set_option_defaults(){
for ( OPTION in OPTIONS ) {
split(OPTIONS[OPTION],a,"|")
key=a[1]
val=a[2]
def=a[3]
DEFAULTS[key]=def
}
}
function get_option(name,value){
if(value==""){
if(DEFAULTS[name] != ""){
value=DEFAULTS[name]
}
}
debug(name " = " value)
return value
}
function print_usage(){
out(sprintf("# %s v%s - by %s", SCRIPTNAME, SCRIPTVERSION, SCRIPTAUTHOR ))
out("# " SCRIPTURL)
out("# Purpose: " SCRIPTPURPOSE)
out("# Usage : " SCRIPTNAME " -v <option>=<value>")
if(isarray(OPTIONS)){
out("# Options:")
for ( OPTION in OPTIONS ) {
split(OPTIONS[OPTION],a,"|")
key=a[1]
val=a[2]
def=a[3]
out(sprintf("# -v %s=<%s> (default: %s)", key, val, def ))
}
}
}
function out(text){
if(printlevel > 0){
print "\033[34m" text "\033[0m" > "/dev/stderr"
}
}
function progress(text){
if(printlevel > 0){
printf text " \r" > "/dev/stderr"
}
}
function debug(text){
if(printlevel > 1){
t=strftime("%H:%M:%S")
printf "\033[35m|%s|\033[0m %s\n",t,text > "/dev/stderr"
}
}
# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
### ------------------- EXECUTED BEFORE ANY INPUT PROCESSING STARTS
BEGIN {
debug("---- START " SCRIPTNAME " [BEGIN]")
intialize_script()
debug("---- FINISH " SCRIPTNAME " [BEGIN]")
}
### ================================================================
### ------------------- EXECUTED FOR EACH LINE
/^[\w]/ {
# add line number
print NR,$0
}
### ================================================================
### ------------------- EXECUTED AFTER ALL INPUT IS RECEIVED
END {
debug("---- START " SCRIPTNAME " [END]")
# if no input given - output usage
if(NR == 0) print_usage()
debug("---- FINISH " SCRIPTNAME " [BEGIN]")
}
# some references:
# https://www.gnu.org/software/gawk/manual/html_node/Executable-Scripts.html