forked from learnbyexample/learn_gnuawk
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGotchas_and_Tips.sh
More file actions
110 lines (55 loc) · 2.52 KB
/
Gotchas_and_Tips.sh
File metadata and controls
110 lines (55 loc) · 2.52 KB
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
## Prefixing $ for variables
awk -v word="cake" '$2==$word' table.txt
awk -v word="cake" '$2==word' table.txt
awk -v field=2 '{print $field}' table.txt
## Dos style line endings
printf 'mat dog\n123 789\n' | awk '{print $2, $1}'
printf 'mat dog\r\n123 789\r\n' | awk '{print $2, $1}'
printf 'mat dog\r\n123 789\r\n' | awk '{sub(/$/, ".")} 1'
printf 'mat dog\r\n123 789\r\n' | awk -v RS='\r\n' '{print $2, $1}'
printf 'mat dog\r\n123 789\r\n' | awk -v RS='\r\n' '{sub(/$/, ".")} 1'
## Behavior of ^ and $ when string contains newline
printf 'apple\n,mustard,grape,\nmango' | awk -v RS=, '/e$/'
printf 'apple\n,mustard,grape,\nmango' | awk -v RS=, '/^m/'
## Word boundary differences
echo 'I have 12, he has 2!' | awk '{gsub(/\y..\y/, "[&]")} 1'
echo 'I have 12, he has 2!' | awk '{gsub(/\<..\>/, "[&]")} 1'
echo 'hi log_42 12b' | awk '{gsub(/\y/, ":")} 1'
echo 'hi log_42 12b' | awk '{gsub(/\</, ":")} 1'
echo 'hi log_42 12b' | awk '{gsub(/\>/, ":")} 1'
## Relying on default initial value
awk '{sum += $NF} END{print sum}' table.txt
awk '{sum += $NF} ENDFILE{print FILENAME ":" sum}' table.txt
awk '{sum += $NF} ENDFILE{print FILENAME ":" sum}' table.txt marks.txt
awk '{sum += $NF} ENDFILE{print FILENAME ":" sum; sum=0}' table.txt marks.txt
## Code in replacement section
awk '{sub(/^(br|ye)/, ++c ") &")} 1' table.txt
awk '/^(br|ye)/{sub(/^/, ++c ") ")} 1' table.txt
awk '{gsub(/\<b/, ++c ") &")} 1' table.txt
## Forcing numeric context
awk '{sum += $NF} END{print sum}' table.txt
awk '{sum += $1} END{print sum}' table.txt
awk '{sum += $1} END{print sum}' /dev/null
awk '{sum += $1} END{print +sum}' /dev/null
echo '3.14' | awk '{$0++} 1'
echo '3,14' | awk '{$0++} 1'
echo '3,14' | LC_NUMERIC=de_DE awk -N '{$0++} 1'
## Forcing string context
echo '5 5.0' | awk '{print ($1==$2 ? "same" : "different"), "number"}'
echo '5 5.0' | awk '{print ($1""==$2 ? "same" : "different"), "string"}'
## Negative NF
cat varying.txt
awk '{NF -= 2} 1' varying.txt
awk 'NF>2{NF -= 2} 1' varying.txt
awk '{print $(NF-2)}' varying.txt
awk 'NF>2{print $(NF-2)}' varying.txt
## Faster execution
time awk '/^([a-d][r-z]){3}$/' /usr/share/dict/words > f1
time LC_ALL=C awk '/^([a-d][r-z]){3}$/' /usr/share/dict/words > f2
time mawk '/^[a-d][r-z][a-d][r-z][a-d][r-z]$/' /usr/share/dict/words > f3
diff -s f1 f2
diff -s f2 f3
rm f[123]
time awk -F'a' 'NF==4{cnt++} END{print +cnt}' /usr/share/dict/words
time LC_ALL=C awk -F'a' 'NF==4{cnt++} END{print +cnt}' /usr/share/dict/words
time mawk -F'a' 'NF==4{cnt++} END{print +cnt}' /usr/share/dict/words