sed/awkショートリファレンス


sedコマンド

簡単なsedの例
指定行または行範囲を出力する
パターンに一致する文字列を含む行を出力する
パターンに一致する文字列を含まない行を出力する
指定行からパターンが一致する行までの範囲を出力する
「/」をパターンに含む場合
行を削除する
行を追加する
行を挿入する
行を置換する
パターンを検索し文字列を置き換える
行範囲の範囲のみパターン検索した文字列を置き換える
行番号を出力する
複数のスクリプトを指定する
スクリプトファイル
パイプによるテキストの入力
直接入力ファイルへ結果を反映させる

awkコマンド

「sed」はストリームエディタ(Stream Editor)の略で、入力テキストに対しパターンに該当する行や文字列を追加/削除/置換など編集を行い、結果を出力します。

コマンドライン

① 処理対象のファイルを指定する。
sed [ -n ] [ -e ] [ -i ] 'スクリプト' 入力ファイル

-n コマンドに該当する行のみ出力し、各行の自動出力を抑止する。
pコマンドの該当行のみを出力させるために、pコマンドと共に指定することが多い。
-e 複数のスクリプトを実行する場合に指定する。スクリプトが1つならば省略可。
-i 処理結果を標準出力へ出力するのではなく、入力ファイルへ反映する。
② 前のコマンドの標準出力をパイプで入力する。
コマンドの標準出力 | sed [ -n ] 'スクリプト'
③ スクリプトのソースファイルを与える。
sed -f スクリプトファイル名 入力ファイル
sedコマンドは編集したテキストを標準出力へ出力します。テキストファイルを直接編集したい場合は「-i」を指定します。

スクリプトの構成

スクリプトは、編集対象となる行の範囲指定に続けて、出力処理のコマンドを記述します。行範囲は、具体的な行番号による指定と、正規表現によるパターン一致検索による指定ができます。スクリプトはシングルクォーテーション、もしくはダブルクォーテーションで囲みます(スクリプトをファイルにした場合はクォーテーションは不要です)。
'《行範囲指定》《コマンド》'

簡単なsedの例

スクリプトがなにもない場合は、ファイルをそのまま出力します。
$ sed '' infile
$ cat infile | sed ''

指定行または行範囲を出力する

pコマンドは、指定する行範囲を出力します。pコマンドは、該当する行範囲以外の行の出力を抑止するために、通常は「-n」オプションと共に使います。
行範囲を指定しない場合は、全ての行がそのまま出力されます。
test.txt
AAAA
BBBB
CCCC
DDDD
EEEE
$ sed -n 'p' test.txt
AAAA
BBBB
CCCC
DDDD
EEEE
2行目のみを出力します。
test.txt
AAAA
BBBB
CCCC
DDDD
EEEE
$ sed -n '2p' test.txt
BBBB
行範囲を行番号で「開始,終了」のように指定できます。行番号は1から数えます。
1~2行目を出力します。
test.txt
AAAA
BBBB
CCCC
DDDD
EEEE
$ sed -n '1,2p' test.txt
AAAA
BBBB
末尾行を出力します。「$」は最後の行を表します。
$ sed -n '1,$p' test.txt
EEEE
2行目以降を出力します。
$ sed -n '2,$p' test.txt
BBBB
CCCC
DDDD
EEEE

パターンに一致する文字列を含む行を出力する

「/~/」の間に指定する文字列と一致する箇所を含む行のみコマンドを処理します。
「BB」を含む行だけ出力します。
test.txt
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
$ sed -n '/BB/p' test.txt
BBBB
BBBB

パターンに一致する文字列を含まない行を出力する

コマンドに「!」をつけるとコマンドが逆に作用します。例えば「!p」はパターンに該当した行以外を出力します。
「BB」を含まない行を出力します。
$ sed -n '/BB/!p' test.txt
AAAA
CCCC
DDDD
AAAA

指定行からパターンが一致する行までの範囲を出力する

「行番号,/パターン/」により行番号からパターンを含む行までの範囲を指定できます。
3行目から「AAA」に一致する5行目までの範囲を出力します。
test.txt
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
$ sed -n -e '3,/AAA/p' test.txt
CCCC
DDDD
AAAA

「/」をパターンに含む場合

パターンの中に「/」の文字を含む場合は、エスケープにより「\/」と表記します。
「BBB/」に一致する行を出力します。
test.txt
AAAA
BBB/
CCCC
DDDD
AAAA
BBBB
$ sed -n '/BBB\//p' test.txt 
BBB/

行を削除する

「d」コマンドは、行を削除します。
全ての行を削除します。
$ sed 'd' infile
行番号か行範囲の指定で削除する範囲を指定できます。
1行目のみ削除します。
test.txt
AAAA
BBBB
CCCC
DDDD
EEEE
$ sed '1d' test.txt
BBBB
CCCC
DDDD
EEEE
1~3行目までを削除します。
$ sed '1,3d' test.txt 
DDDD
EEEE
最後の行だけ削除します。
$ sed '$d' test.txt
AAAA
BBBB
CCCC
DDDD
3行目以降を削除します。
$ sed '3,$d' test.txt
AAAA
BBBB
「BB」を含む行を削除します。
$ sed '/BB/d' test.txt
AAAA
CCCC
DDDD
AAAA
3行目から「DD」を含む行までを削除します。
$ sed '3,/DD/d' test.txt
AAAA
BBBB
EEEE
空行を削除します。正規表現で空行を表す「^$」をパターンに指定します。
test.txt
AAAA

CCCC

EEEE
FFFF
$ sed '/^$/d' test.txt
AAAA
CCCC
EEEE
FFFF

行を追加する

「a」コマンドは、行を追加します。行範囲やパターンに一致する行の次に、「a」コマンドに続けて指定する文字列からなる行を追加します。
1~3行目のそれぞれの行の次に「wwww」の行を追加します。
test.txt
AAAA
BBBB
CCCC
DDDD
EEEE
$ sed '1,3a wwww' test.txt 
AAAA
wwww
BBBB
wwww
CCCC
wwww
DDDD
EEEE
パターンの指定により、「BB」を含む行の次に「wwww」の行を追加します。
$ sed '/BBBB/a wwww' test.txt
AAAA
BBBB
wwww
CCCC
DDDD
EEEE
空白文字から始まる行を追加したい場合は、先頭の空白文字を「\」でエスケープします。。
$ sed 'a \ wwww' test.txt
AAAA
 wwww
BBBB
 wwww
CCCC
 wwww
DDDD
 wwww
EEEE
 wwww
先頭から空白文字が連続する場合の2文字目の空白文字はエスケープは不要です。
$ sed 'a \  wwww' test.txt
タブ文字の場合はエスケープの「\」と「\t」を組み合わせます。
$ sed 'a \\twwww' test.txt

行を挿入する

「i」コマンドは、行を挿入します。行範囲やパターンに一致する行の前に、「i」コマンドに続けて指定する文字列からなる行を挿入します。
1~3行目のそれぞれの行の前に「vvvv」の行を挿入します。
test.txt
AAAA
BBBB
CCCC
DDDD
EEEE
$ sed '1,3i vvvv' test.txt
vvvv
AAAA
vvvv
BBBB
vvvv
CCCC
DDDD
EEEE
パターンの指定により、「CC」を含む行の前に「vvvv」の行を挿入します。
$ sed '/CC/i vvvv' test.txt
AAAA
BBBB
vvvv
CCCC
DDDD
EEEE

行を置換する

「c」コマンドは、行を置換します。行範囲やパターンに一致する行を、「c」コマンドに続けて指定する文字列からなる行に置換します。
3行目を「xxxx」の行に置換します。
test.txt
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
$ sed '3c xxxx' test.txt
AAAA
BBBB
xxxx
DDDD
AAAA
BBBB
行範囲を指定する場合は、その範囲の各行が置き換わるのではなく、範囲がまとめて1行に置き換わります。
1~3行目を「xxxx」の1行に置換します。
$ sed '1,3c xxxx' test.txt
xxxx
DDDD
AAAA
BBBB
パターンの指定により、「AA」を含む行を「xxxx」の行に置換します。
$ sed '/AA/cxxxx' test.txt
xxxx
BBBB
CCCC
DDDD
xxxx
BBBB

パターンを検索し文字列を置き換える

「s」コマンドは、行の中のパターンに一致する部分文字列を置換します。次の書式でパターンを指定すると、各行を検索して文字列1のパターンに一致する部分を文字列2に置換します。
s/文字列1/文字列2/
全ての行から「BB」の部分を「11」に置き換えます。ただしデフォルトでは、置き換えられるのは1行内で最初に一致した部分だけです。
test.txt
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
$ sed 's/BB/11/' test.txt
AAAA
11BB
CCCC
DDDD
AAAA
11BB
「s/文字列1/文字列2/g」とすることで、行中の一致する箇所を全て置換します。
$ sed 's/BB/22/g' test.txt
AAAA
2222
CCCC
DDDD
AAAA
2222
行頭の「A」を「(a)」に置き換えます。検索パターンは正規表現で指定できます。
$ sed 's/^A/(a)/' test.txt
(a)AAA
BBBB
CCCC
DDDD
(a)AAA
BBBB
正規表現で行末への置換を指定すると、行末への文字列の追加ができます。
$ sed 's/$/zzz/' test.txt
AAAAzzz
BBBBzzz
CCCCzzz
DDDDzzz
AAAAzzz
BBBBzzz
置き換える文字列では「&」は一致した文字列そのものを表します。
$ sed 's/BBBB/xxx &/' test.txt
AAAA
xxx BBBB
CCCC
DDDD
AAAA
xxx BBBB

行範囲の範囲のみパターン検索した文字列を置き換える

次のように行範囲を指定することで、その範囲のみ文字列の検索と置換を行います。
開始行,終了行s/文字列1/文字列2/
1~4行目の範囲で、「BB」を「22」に置換します。最後の行の「BBBB」は範囲外なので置換されません。。
test.txt
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
$ sed '1,4s/BB/22/g' test.txt
AAAA
2222
CCCC
DDDD
AAAA
BBBB
全ての行を検索して置換します。
$ sed '1,$s/BB/22/g' test.txt
AAAA
2222
CCCC
DDDD
AAAA
2222

行番号を出力する

「=」コマンドは、行番号を出力します。
「BBBB」に一致する行の行番号を出力します。
「-n」オプションを付けることで、行番号のみを出力します。
test.txt
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
$ sed -n '/BBBB/=' test.txt
2
6

複数のスクリプトを指定する

「-e」オプションを指定することで複数のスクリプトを指定できます。
「AAAA」に一致する行と、最終行を削除します。
test.txt
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
$ sed -e '/AAAA/d' -e '$d' test.txt
BBBB
CCCC
DDDD

スクリプトファイル

「-f」オプションにより、ファイルに記述したスクリプトを指定することができます。
test.txt
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
ファイルに記述するスクリプトにはクォーテーションの囲みは不要です。
replace.sed
s/BBBB/vvvv/
$ sed -f replace.sed test.txt
AAAA
vvvv
CCCC
DDDD
AAAA
vvvv

パイプによるテキストの入力

sedは、パイプにより標準入力を処理するフィルタとして働きます。
ファイルをパイプから標準入力で入力し、最終行を削除して出力します。
test.txt
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
$ cat test.txt | sed '1d'
BBBB
CCCC
DDDD
AAAA
BBBB
lsコマンドの出力結果から「etc」を含む出力のみを抽出します。
$ ls -l / | sed -n '/etc/p'
drwxr-xr-x+  1 user staff                0 8月  16 16:23 etc

直接入力ファイルへ結果を反映させる

「-i」オプションにより、入力ファイルの処理結果を標準出力ではなく入力ファイルに直接反映させることができます。
入力ファイルそのものに「AAAA」の行が「xxxx」に置き換わって編集されます。
test.txt
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
$ sed -i 's/AAAA/xxxx/' test.txt
$ cat test.txt
xxxx
BBBB
CCCC
DDDD
xxxx
BBBB

awkコマンド

簡単なawkの例
フィールドの変数
複数のアクションを行う
正規表現のパターンに一致する行のみ処理する
特定のフィールドに対しパターンを指定する
行範囲を指定する
フィールドを数値として条件判断する
フィールド数
入力テキストの行(レコード)の区切り文字を指定する
入力テキストのフィールドの区切り文字を指定する
出力時の行(レコード)の区切り文字を指定する
出力時のフィールドの区切り文字を指定する
テキストの読み込み前と後に行う処理を指定する
繰り返し制御文 while
繰り返し制御文 for
条件によりアクションの実行する if
入力ファイル名を示す変数
フィールドの文字列の長さを返す関数length()
クリプトファイル
パイプによるテキストの入力

sedコマンド

awkはテキストファイルの処理を行うコマンドです。テキストファイルの各行を、空白やカンマで区切られたフィールド要素に対して、スクリプトに書かれた編集処理を行い結果を出力します。

コマンドライン

① 処理対象のファイルを指定する。
awk [option] 'スクリプト' 入力ファイル
② 前のコマンドの標準出力をパイプで入力する。
コマンドの標準出力 | awk 'スクリプト'
③ スクリプトをファイルで与える。
awk -f スクリプトファイル名 入力ファイル

スクリプトの構成

スクリプト部分は「パターン」と「アクション」の組み合わせで記述します。
入力ファイルの先頭行から行単位で、全ての行またはパターンに一致する行に対し、アクションで指定する処理を実行します。これは先頭行から順に行単位に処理されます。スクリプトは、シングルクォーテーションで囲んだ中、あるいは-fオプションにより指定するスクリプトファイルに記述します。
'パターン {アクション}'
パターン 主に正規表現で指定します。正規表現にマッチした行について「アクション」を行います。パターンを省略すると、入力ファイルの全ての行に対しアクションを行います。正規表現の他に、BEGIN/ENDという特殊パターンや、変数を使った条件式が指定できます。
アクション 対象の行への処理を記述します。

簡単なawkの例

パターンを省略した場合は、printアクションは全ての行を出力します。
次の2つは、単純に入力ファイル「infile」の中身を表示します。
$ awk '{print}' infile
$ cat infile | awk '{print}'

フィールドの変数

入力ファイルの各行のテキストは、区切り文字(デフォルトで空白かタブ)で区切られたフィールドに分解され、行頭からフィールドを順番に「$1」「$2」「$3」という番号付きの変数で参照できます。また行全体を「$0」で参照できます。
入力ファイル「test.txt」の各行をそのまま出力します。
test.txt
Lexus
Toyota
Nissan
Honda
$ awk '{print $0}' test.txt
Lexus
Toyota
Nissan
Honda
フィールドの2番目と1番目を入れ替えて出力します。
test.txt
Lexus LS
Toyota CROWN
Nissan GT-R
Honda Fit
$ awk '{print $2, $1}' test.txt
LS Lexus
CROWN Toyota
GT-R Nissan
Fit Honda
各行の2番目のフィールドのみを出力します。
$ awk '{print $2}' test.txt
LS
CROWN
GT-R
Fit
任意の文字列と組み合わせてフィールドの文字列を出力します。
$ awk '{print $2 "--" $1}' test.txt
LS--Lexus
CROWN--Toyota
GT-R--Nissan
Fit--Honda

複数のアクションを行う

アクションは、「;」で区切ることで複数の処理が行えます。または、アクションの{~}を複数に分けて並べても同様です。
2番目のフィールドに続き1番目のフィールドを、それぞれを個別のprintコマンドで出力します。
test.txt
Lexus LS
Toyota CROWN
Nissan GT-R
Honda Fit
$ awk '{print $2 ; print $1}' test.txt
LS
Lexus
CROWN
Toyota
GT-R
Nissan
Fit
Honda
これは次のようにしても同じことができます。
$ awk '{print $2} {print $1}' test.txt 

正規表現のパターンに一致する行のみ処理する

正規表現で指定するパターンに一致する行に対しアクションを実行させることができます。
「kumagaya」に一致する行の、2番目のフィールドを表示します。
test.txt
tachikawa  35
oomiya      39
kumagaya    40
yokohama    34
sapporo     29
takasaki    35
$ awk '/kumagaya/{print $2}' test.txt
40   
先頭が「ta~」ではじまる行を2番目のフィールドから先に表示します。
$ awk '/^ta/{print $2, $1}' test.txt
35 tachikawa
35 takasaki

特定のフィールドに対しパターンを指定する

フィールドの変数と「~」に続いてパターンを指定すると、そのフィールドとのパターンが一致した行が対象となります。「~」は左辺とパターンの一致を調べる演算子です。一致しない条件の場合は「!~」とします。
第2フィールドが「35」に一致する行を出力します。
test.txt
tachikawa    35
oomiya      39
kumagaya    40
yokohama    34
sapporo     29
takasaki    35
$ awk '$2 ~ /35/ {print $0}' test.txt
tachikawa    35
takasaki    35

行範囲を指定する

組み込み変数「NR」は行番号を示します。NRの行番号は1から始まります。
入力ファイルの行番号を表示します。
test.txt
Lexus LS
Toyota CROWN
Nissan GT-R
Honda Fit
$ awk '{print NR}' test.txt
1
2
3
4
NRの値の範囲の条件を指定すると、その行範囲に対して処理ができます。例えば「NR>1」は2行目以降を表します。「>」は数値を比較演算します。比較演算子は、「>(より大きい)」「<(より小さい)」「>=(等しいか大きい)」「<=(等しいか小さい)」「==(等しい)」「!=(等しくない)」があります。
入力ファイルの4行目以降からを出力します。
test.txt
tachikawa  35
oomiya      39
kumagaya    40
yokohama    34
sapporo     29
takasaki    35
$ awk 'NR>3{print $0}' test.txt
yokohama   34
sapporo     29
takasaki    35
複数の条件を論理演算で組み合わせることができます。論理積(AND)は「&&」、論理和(OR)は「||」、否定は「!」です。
A && B AかつB
A || B AまたはB
!C Cでない
$ awk 'NR>=2 && NR<=4{print $0}' test.txt
oomiya       39
kumagaya    40
yokohama    34

フィールドを数値として条件判断する

あるフィールドが示す文字列が数値を表している場合は、数値として条件判断ができます。
2番目のフィールドの数値が30を超えている行の1番目のフィールドを出力します。
test.txt
tachikawa   35
oomiya      39
kumagaya    40
yokohama    34
sapporo     29
takasaki    35
$ awk '$2>30{print $1}' test.txt
tachikawa
oomiya
kumagaya
yokohama
takasaki

フィールド数

組み込み変数「NF」は行の中のフィールド数を示します。
各行のフィールド数を出力します。
test.txt
Suzuki GSX
Kawasaki KX
Honda CB NS
Yamaha SR YZF
$ awk '{print NF}' test.txt
2
2
3
3

入力テキストの行(レコード)の区切り文字を指定する

アクションの実行単位(レコード)はデフォルトで行単位ですが、組み込み変数の「RS」へ区切り文字を指定することで処理単位(レコード)の区切り文字を指定できます。
RSに「;」を設定すると、awkは「;」で区切られた区間ごとを行として処理します。「-v」オプションにより「-v RS=区切り文字」の書式でawkの処理前にRS変数を設定します。
改行ではなく「;」の区切りを1行として出力します。
test.txt
tachikawa 35;oomiya 39;kumagaya 40;yokohama 34;sapporo 29;takasaki 35
$ awk -v RS=";" '{print $0}' test.txt
tachikawa 35
oomiya 39
kumagaya 40
yokohama 34
sapporo 29
takasaki 35

入力テキストのフィールドの区切り文字を指定する

各行のフィールドの区切りはデフォルトで空白かタブ文字ですが、組み込み変数の「FS」へ区切り文字を指定することでフィールドの区切り文字を任意の文字に変更できます。これを「-F」オプションで任意の文字に変更できます。
FSに「,」を設定すると、awkは「,」をフィールドの区切りとして処理します。「-v」オプションにより「-v FS=区切り文字」の書式でawkの処理前にFS変数を設定します。
区切り文字を「,」に設定し、入力ファイルの各行のカンマ「,」で区切られたフィールドの2番を出力します。
test.txt
Lexus,LS
Toyota,CROWN
Nissan,GT-R
Honda,Fit
$ awk -v FS="," '{print $2}' test.txt
LS
CROWN
GT-R
Fit
また「-F」オプションで直接フィールドの区切りを指定できます。同じことを次のようにできます。
$ awk -F "," '{print $2}' test.txt

出力時の行(レコード)の区切り文字を指定する

各行の出力はデフォルトで改行ですが、組み込み変数の「ORS」へ区切り文字を指定することで、改行以外の区切りで出力できます。
「-v」オプションにより「-v ORS=区切り文字」の書式でawkの処理前にORS変数を設定します。
$ awk -v ORS="/" '{print $1}' test.txt
tachikawa/oomiya/kumagaya/yokohama/sapporo/takasaki/

出力時のフィールドの区切り文字を指定する

出力のフィールドはデフォルトで空白かタブ文字ですが、組み込み変数の「OFS」へ区切り文字を指定することで、フィールド間を任意の区切りで出力できます。「-v」オプションにより「-v OFS=区切り文字」の書式でawkの処理前にOFS変数を設定します。
$ awk -v OFS=":" '{print $1, $2}' test.txt
tachikawa:35
oomiya:39
kumagaya:40
yokohama:34
sapporo:29
takasaki:35

テキストの読み込み前と後に行う処理を指定する

テキストを読み込む前に実行するアクションをBEGIN〜に続けて、またすべての処理終了後に実行するアクションをEND〜に続けて指定できます。
出力の始めと終わりに「---」と「===」を表示します。
test.txt
tachikawa 35
oomiya      39
kumagaya    40
yokohama    34
sapporo     29
takasaki    35
$ awk 'BEGIN{ print "----" } {print $1} END{print "===="}' test.txt
----
tachikawa
oomiya
kumagaya
yokohama
sapporo
takasaki
====
BEGINの中に、awk処理前にあらかじめ変数を代入しておくことができます。
「-v」オプションを使わずに、テキスト読み込み前にレコードの区切り文字を指定する変数「RS」に「;」を指定します。
test.txt
tachikawa 35;oomiya 39;kumagaya 40;yokohama 34;sapporo 29;takasaki 35
$ awk 'BEGIN{RS=";"} {print $0}' test.txt
tachikawa 35
oomiya 39
kumagaya 40
yokohama 34
sapporo 29
takasaki 35
同様に、フィールドの区切り文字を指定する変数「FS」を空白から「,」に変更します。
test.txt
tachikawa,35
oomiya,39
kumagaya,40
yokohama,34
sapporo,29
takasaki,35
$ awk 'BEGIN{FS=","} {print $1 "-" $2}' test.txt   
tachikawa-35
oomiya-39
kumagaya-40
yokohama-34
sapporo-29
takasaki-35
各行の2番目のフィールドの平均値を、処理終了後に計算して出力します。
test.txt
tachikawa,35
oomiya,39
kumagaya,40
yokohama,34
sapporo,29
takasaki,35
$ awk 'BEGIN{FS=","} {s=s+$2} END{print s/NR}'
35.3333

繰り返し制御文 while

制御文「while」によりアクションの繰り返しができます。 繰り返しの条件を指定できます。
while(繰り返し条件){繰り返す処理}
2番目以降のフィールドを数値として平均を計算して出力します。
test.txt
tachikawa 35 36 34 36
oomiya     39 39 36
kumagaya  40 39 39 40 37 39
yokohama 34 34 35 35
sapporo        29 30 29 32 25
takasaki    33 36
$ awk '{i=2 ; s=0 ; while(i <= NF){s=s+$i; i++} ; print $1, s/(NF-1)}' test.txt
tachikawa 35.25
oomiya 38
kumagaya 39
yokohama 34.5
sapporo 29
takasaki 34.5

繰り返し制御文 for

while文と同様に、制御文「for」により処理の繰り返しができます。while文と異なるのは、繰り返しの最初のみ行う処理と、繰り返し毎に行う処理を構文の中に記述できることです。
for (最初だけの処理;繰り返し条件;繰り返し毎の処理){繰り返す処理}
2番目以降のフィールドを数値として平均を計算して出力します。
test.txt
tachikawa  35 36 34 36
oomiya     39 39 36
kumagaya  40 39 39 40 37 39
yokohama 34 34 35 35
sapporo        29 30 29 32 25
takasaki    33 36
$ awk '{s=0 ; for(i=2;i<=NF;i++){s=s+$i} ; print $1, s/(NF-1)}' test.txt
tachikawa 35.25
oomiya 38
kumagaya 39
yokohama 34.5
sapporo 29
takasaki 34.5

条件によりアクションの実行する if

制御文「if」は条件により異なるアクションを処理できます。
if (条件文) 条件Yesの処理; else 条件Noの処理
else以降は省略できます。
2番目のフィールドが35以上のものだけ横に「*」をつけて出力します。
test.txt
tachikawa 35
oomiya      39
kumagaya    40
yokohama    34
sapporo     29
takasaki    35
$ awk '{if($2>=35)print $1"*" ;else print $1}' test.txt
tachikawa*
oomiya*
kumagaya*
yokohama
sapporo
takasaki*

入力ファイル名を示す変数

FILENAMEは、入力ファイルのファイル名を示す変数です。
入力ファイルの内容とは無関係に入力ファイル名を出力します。
test.txt
Lexus LS
Toyota CROWN
Nissan GT-R
Honda Fit
$ awk '{print FILENAME}' test.txt
test.txt
test.txt
test.txt
test.txt

フィールドの文字列の長さを返す関数length()

length()はフィールドの文字列の長さを返す関数です。
フィールドの文字列の長さが0の場合は、そのフィールドが存在しないことを意味します。それを利用してフィールドの終わりを判断し、フィールド数が異なる行を読み込むことができます。
フィールド数が異なる各行を、length()でフィールドの終端を判断して出力します。
test.txt
Suzuki GSX
Kawasaki KX
Honda CB NS
Yamaha SR YZF
$ awk '{for(i=1;length($i)>0;i++){print $i}}' test.txt
Suzuki
GSX
Kawasaki
KX
Honda
CB
NS
Yamaha
SR
YZF

クリプトファイル

「-f」オプションにより、ファイルに記述したスクリプトを指定できます。
各行の平均値を表示するスクリプトを「avr.awk」というスクリプトファイルにしてそれを「-f」オプションで指定します。
test.txt
tachikawa 35 36 34 36
oomiya     39 39 36
kumagaya  40 39 39 40 37 39
yokohama 34 34 35 35
sapporo        29 30 29 32 25
takasaki    33 36
avr.awk
{
    i=1;
    s=0;
    while (i <= NF){
        s=s+$i; i++;
    }
    print $1 " " s/(NF-1)
}
$ awk -f avr.awk test.txt
tachikawa 35.25
oomiya 38
kumagaya 39
yokohama 34.5
sapporo 29
takasaki 34.5

パイプによるテキストの入力

awkは、パイプにより標準入力を処理するフィルタとして働きます。
「ls -l」の出力結果からファイルサイズの部分だけを出力します。
$ ls -l | awk 'NR>1{print $5}'
17685
44
このls -lの元の出力は次の通りで、先頭行の「total 48」は「NR>1」の指定により除外されます。
total 48
-rw-r--r--  1 user  staff  17685  8 17 00:06 awk.doc
-rw-r--r--  1 user  staff     44  8 17 00:06 test