updates for version 1.0 · learnbyexample/learn_gnuawk@024e6c2 · GitHub
Skip to content

Commit 024e6c2

Browse files
updates for version 1.0
1 parent 65df275 commit 024e6c2

47 files changed

Lines changed: 1717 additions & 16 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎code_snippets/Builtin_functions.sh‎

Lines changed: 31 additions & 4 deletions

‎code_snippets/Control_Structures.sh‎

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
## if-else
2+
13
awk '/^b/{print; if($NF>0) print "------"}' table.txt
24

35
awk '/^b/{print; if($NF>0) print "------"; else print "======"}' table.txt
@@ -6,6 +8,8 @@ seq 6 | awk '{ORS = NR%3 ? "-" : RS} 1'
68

79
awk '/^b/{print; print($NF>0 ? "------" : "======")}' table.txt
810

11+
## loops
12+
913
awk 'BEGIN{for(i=2; i<7; i+=2) print i}'
1014

1115
awk -v OFS=, '{for(i=1; i<=NF; i++) if($i ~ /^[bm]/) $i="["$i"]"} 1' table.txt
@@ -20,17 +24,23 @@ awk 'BEGIN{i=6; while(i>0){print i; i-=2}}'
2024

2125
echo 'titillate' | awk '{while(gsub(/til/, "")) print}'
2226

27+
echo 'titillate' | awk '{do{print} while(gsub(/til/, ""))}'
28+
29+
## next
30+
2331
awk '/\<par/{print "%% " $0; next} {print /s/ ? "X" : "Y"}' word_anchors.txt
2432

33+
## exit
34+
2535
seq 3542 4623452 | awk 'NR==2452{print; exit}'
2636

2737
echo $?
2838

29-
awk '/^br/{print "Invalid input"; exit 1}' table.txt
39+
awk '/^br/{print "Invalid input"; exit 1}' table.txt
3040

3141
echo $?
3242

33-
awk 'FNR==2{print; exit}' table.txt greeting.txt
43+
awk 'FNR==2{print; exit}' table.txt greeting.txt
3444

3545
awk 'BEGIN{print "hi"; exit; print "hello"}
3646
/^b/;

‎code_snippets/Dealing_with_duplicates.sh‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
1+
## Whole line duplicates
2+
13
cat purchases.txt
24

35
awk '{print +a[$0] "\t" $0; a[$0]++}' purchases.txt
46

57
awk '!a[$0]++' purchases.txt
68

9+
## Column wise duplicates
10+
711
cat duplicates.txt
812

913
awk -F, '!seen[$NF]++' duplicates.txt
1014

1115
awk -F, '!seen[$1,$3]++' duplicates.txt
1216

17+
## Duplicate count
18+
1319
awk -F, '++seen[$2]==2' duplicates.txt
1420

1521
awk -F, '++seen[$NF]==3' duplicates.txt

‎code_snippets/Field_separators.sh‎

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
## Default field separation
2+
13
cat table.txt
24

35
awk '$1 ~ /^b/{print $4}' table.txt
@@ -18,7 +20,7 @@ echo ' a b c ' | awk '{print $NF "."}'
1820

1921
printf ' one \t two\t\t\tthree ' | awk '{print NF}'
2022

21-
printf ' one \t two\t\t\tthree ' | awk '{print $2}'
23+
printf ' one \t two\t\t\tthree ' | awk '{print $2 "."}'
2224

2325
awk 'BEGIN{printf "%.16f\n", 2.999999999999999}'
2426

@@ -28,6 +30,8 @@ awk '{print $2.999999999999999}' table.txt
2830

2931
awk '{print $2.9999999999999999}' table.txt
3032

33+
## Input field separator
34+
3135
echo 'goal:amazing:whistle:kwality' | awk -F: '{print $1}'
3236

3337
echo 'goal:amazing:whistle:kwality' | awk -F: '{print $NF}'
@@ -60,6 +64,14 @@ echo ' a b c ' | awk -F' ' '{print NF}'
6064

6165
echo ' a b c ' | awk -F'[ ]' '{print NF}'
6266

67+
echo 'RECONSTRUCTED' | awk -F'[aeiou]+' -v IGNORECASE=1 '{print $1}'
68+
69+
echo 'RECONSTRUCTED' | awk -F'e' -v IGNORECASE=1 '{print $1}'
70+
71+
echo 'RECONSTRUCTED' | awk -F'[e]' -v IGNORECASE=1 '{print $1}'
72+
73+
## Output field separator
74+
6375
awk '{print $1, $3}' table.txt
6476

6577
echo 'goal:amazing:whistle:kwality' | awk -F: -v OFS=: '{print $2, $NF}'
@@ -78,6 +90,8 @@ echo 'Sample123string42with777numbers' | awk -F'[0-9]+' -v OFS=, '1'
7890

7991
echo 'Sample123string42with777numbers' | awk -F'[0-9]+' -v OFS=, '{$1=$1} 1'
8092

93+
## Manipulating NF
94+
8195
echo 'goal:amazing:whistle:kwality' | awk -F: -v OFS=, '{NF=2} 1'
8296

8397
echo 'goal:amazing:whistle:kwality' | awk -F: -v OFS=: '{$(NF+1)="sea"} 1'
@@ -86,6 +100,8 @@ echo 'goal:amazing:whistle:kwality' | awk -F: -v OFS=: '{$8="go"} 1'
86100

87101
echo 'goal:amazing:whistle:kwality' | awk -F: -v OFS=: '{NF=-1} 1'
88102

103+
## FPAT
104+
89105
s='Sample123string42with777numbers'
90106

91107
echo "$s" | awk -v FPAT='[0-9]+' '{print $2}'
@@ -98,6 +114,14 @@ echo "$s" | awk -F, '{print $2}'
98114

99115
echo "$s" | awk -v FPAT='"[^"]*"|[^,]*' '{print $2}'
100116

117+
echo 'Read Eat Sleep' | awk -v FPAT='e' '{print NF}'
118+
119+
echo 'Read Eat Sleep' | awk -v IGNORECASE=1 -v FPAT='e' '{print NF}'
120+
121+
echo 'Read Eat Sleep' | awk -v IGNORECASE=1 -v FPAT='[e]' '{print NF}'
122+
123+
## FIELDWIDTHS
124+
101125
cat items.txt
102126

103127
awk -v FIELDWIDTHS='8 4 6' '{print $2}' items.txt

‎code_snippets/Gotchas_and_Tips.sh‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
## Prefixing $ for variables
2+
13
awk -v word="cake" '$2==$word' table.txt
24

35
awk -v word="cake" '$2==word' table.txt
46

57
awk -v field=2 '{print $field}' table.txt
68

9+
## Dos style line endings
10+
711
printf 'mat dog\n123 789\n' | awk '{print $2, $1}'
812

913
printf 'mat dog\r\n123 789\r\n' | awk '{print $2, $1}'
@@ -14,6 +18,8 @@ printf 'mat dog\r\n123 789\r\n' | awk -v RS='\r\n' '{print $2, $1}'
1418

1519
printf 'mat dog\r\n123 789\r\n' | awk -v RS='\r\n' '{sub(/$/, ".")} 1'
1620

21+
## Word boundary differences
22+
1723
echo 'I have 12, he has 2!' | awk '{gsub(/\y..\y/, "[&]")} 1'
1824

1925
echo 'I have 12, he has 2!' | awk '{gsub(/\<..\>/, "[&]")} 1'
@@ -24,6 +30,8 @@ echo 'hi log_42 12b' | awk '{gsub(/\</, ":")} 1'
2430

2531
echo 'hi log_42 12b' | awk '{gsub(/\>/, ":")} 1'
2632

33+
## Relying on default initial value
34+
2735
awk '{sum += $NF} END{print sum}' table.txt
2836

2937
awk '{sum += $NF} ENDFILE{print FILENAME ":" sum}' table.txt
@@ -32,6 +40,16 @@ awk '{sum += $NF} ENDFILE{print FILENAME ":" sum}' table.txt marks.txt
3240

3341
awk '{sum += $NF} ENDFILE{print FILENAME ":" sum; sum=0}' table.txt marks.txt
3442

43+
## Code in replacement section
44+
45+
awk '{sub(/^(br|ye)/, ++c ") &")} 1' table.txt
46+
47+
awk '/^(br|ye)/{sub(/^/, ++c ") ")} 1' table.txt
48+
49+
awk '{gsub(/\<b/, ++c ") &")} 1' table.txt
50+
51+
## Forcing numeric context
52+
3553
awk '{sum += $NF} END{print sum}' table.txt
3654

3755
awk '{sum += $1} END{print sum}' table.txt
@@ -40,10 +58,14 @@ awk '{sum += $1} END{print sum}' /dev/null
4058

4159
awk '{sum += $1} END{print +sum}' /dev/null
4260

61+
## Forcing string context
62+
4363
echo '5 5.0' | awk '{print ($1==$2 ? "same" : "different"), "number"}'
4464

4565
echo '5 5.0' | awk '{print ($1""==$2 ? "same" : "different"), "string"}'
4666

67+
## Negative NF
68+
4769
cat varying.txt
4870

4971
awk '{NF -= 2} 1' varying.txt
@@ -54,6 +76,8 @@ awk '{print $(NF-2)}' varying.txt
5476

5577
awk 'NF>2{print $(NF-2)}' varying.txt
5678

79+
## Faster execution
80+
5781
time awk '/^([a-d][r-z]){3}$/' /usr/share/dict/words > f1
5882

5983
time LC_ALL=C awk '/^([a-d][r-z]){3}$/' /usr/share/dict/words > f2

‎code_snippets/Inplace_file_editing.sh‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
cat greeting.txt
1+
## Without backup
22

3-
awk -i inplace '{print NR ". " $0}' greeting.txt
3+
cat greet.txt
44

5-
cat greeting.txt
5+
awk -i inplace '{print NR ". " $0}' greet.txt
6+
7+
cat greet.txt
68

79
cat f1.txt
810

@@ -14,6 +16,8 @@ cat f1.txt
1416

1517
cat f2.txt
1618

19+
## With backup
20+
1721
cat f3.txt
1822

1923
awk -i inplace -v inplace::suffix='.bkp' -v OFS=, '{$1=$1} 1' f3.txt

‎code_snippets/Installation_and_Documentation.sh‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
wget https://ftp.gnu.org/gnu/gawk/gawk-5.0.1.tar.xz
1+
## Installation
22

3-
tar -Jxf gawk-5.0.1.tar.xz
3+
wget https://ftp.gnu.org/gnu/gawk/gawk-5.1.0.tar.xz
44

5-
cd gawk-5.0.1/
5+
tar -Jxf gawk-5.1.0.tar.xz
6+
7+
cd gawk-5.1.0/
68

79
./configure
810

@@ -14,7 +16,11 @@ type -a awk
1416

1517
awk --version | head -n1
1618

19+
## Documentation
20+
1721
man awk
1822

23+
## Options overview
24+
1925
awk --help
2026

‎code_snippets/Multiple_file_input.sh‎

Lines changed: 7 additions & 1 deletion

0 commit comments

Comments
 (0)