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