「Linuxコマンド - awk」の版間の差分

ナビゲーションに移動 検索に移動
編集の要約なし
155行目: 155行目:
  4
  4
  3
  3
<br><br>
== awkを使用したフィルタリング ==
==== 空白で区切られた特定のフィールドを切り出す ====
<code>awk</code>の組み込み変数<code>$x</code>には、xフィールド目に存在する文字列が設定されている。<br>
これを、<code>awk</code>の<code>print</code>文で出力することにより、特定のフィールドのみを切り出すことができる。<br>
<br>
<code>cut</code>コマンドでも空白区切りのフィールドを切り出すことが可能だが、特に、フィールド間の空白数が一定でない場合は<code>awk</code>コマンドを使用する。<br>
一定の空白数の有無に関わらず、空白区切りのフィールドを切り出すには、<code>awk</code>コマンドを使用した方がよい。<br>
awk '{ print $フィールド番号 }'  # awkコマンドの組み込み変数で対象フィールドのみを出力する
<br>
以下の例では、特定のフィールドを切り出している。<br>
cat test.txt
111    ABC        abc
            222 DEF  def
  333          GHI ghi
444  JKL              jkl
555  MNO  mno
    666 PQR pqr
777                STU  stu
                      888 VWX vwx
999 YZ yz
<br>
1フィールド目を切り出す。<br>
awk '{ print $1 }' test.txt
111
222
333
444
555
666
777
888
999
<br>
2フィールド目を切り出す。<br>
awk '{ print $2 }' test.txt
ABC
DEF
GHI
JKL
MNO
PQR
STU
VWX
YZ
<br>
3フィールド目を切り出す。<br>
awk '{ print $3 }' awktest.txt
abc
def
ghi
jkl
mno
pqr
stu
vwx
yz
<br>
対象となる行を特定してフィールドを切り出す。<br>
<br>
行番号を指定することで、処理対象となる範囲を限定することができる。<br>
また、行番号指定の場合は、<code>==</code>以外にも、<code><</code>、<code>></code>、<code><=</code>、<code>>=</code>、<code>!=</code>が使用できる。<br>
さらに、<code>||</code>(OR条件)や<code>&&</code>(AND条件)で複数の条件を指定することもできる。<br>
<br>
<code>NR</code>は行番号を表すawkコマンドの組み込み変数である。<br>
awk '(NR == 行番号){ print $フィールド番号 }'  # awkコマンドに処理対象とする行番号を指定する
<br>
1行目のみを処理対象とする。<br>
awk '(NR == 1){ print $1 }' test.txt
111
<br>
1行目および9行目を処理対象とする。<br>
awk '(NR == 1 || NR == 9){ print $1 }' test.txt
111
999
<br>
5行目を超えて8行目以下、つまり、6行目から8行目までの行を処理対象とする。<br>
awk '(NR > 5 && NR <= 8){ print $1 }' test.txt
666
777
888
<br>
==== 空白で区切られたフィールドの順番を入れ替える ====
"hoge fuga foo bar"のように空白で区切られた各フィールドを、"bar hoge bar foo"のように順番を入れ替えて出力するには、<code>awk</code>コマンドを使用する。<br>
<br>
<code>awk</code>コマンドにおいて、$xはx番目のフィールドを意味する。<br>
つまり、フィールドの順番を入れ替えるには、出力したい順番で$xを指定する。<br>
<br>
例えば、3つのフィールドの順番を逆にする場合は、<code>$3" "$2" "$1</code>と指定する。<br>
<code>" "</code>は、フィールド間のスペースを意味するため、これを指定せずに実行すると、各フィールドが結合した状態で出力されてしまう。<br>
awk '{ print $フィールド番号" "$フィールド番号" "..." "$フィールド番号 }'  # awkコマンドで各フィールドの番号を出力したい順に指定する
<br>
cat shuffle.txt
111 ABC abc
222 DEF def
333 GHI ghi
444 JKL jkl
555 MNO mno
<br>
以下の例では、空白スペース" "を指定していないため、全て結合された状態で出力されている。<br>
awk '{ print $3 $1 $2 }' shuffle.txt
abc111ABC
def222DEF
ghi333GHI
jkl444JKL
mno555MNO
<br>
以下の例では、$xの間に" "を指定しているため、フィールド間がスペースで区切られている。<br>
awk '{ print $3" "$1" "$2 }' shuffle.txt
abc 111 ABC
def 222 DEF
ghi 333 GHI
jkl 444 JKL
mno 555 MNO
<br>
以下の例では、同じフィールドを2回出力している。<br>
awk '{ print $3" "$1" "$1" "$2 }' shuffle.txt
abc 111 111 ABC
def 222 222 DEF
ghi 333 333 GHI
jkl 444 444 JKL
mno 555 555 MNO
<br>
シェルスクリプトに組み込んで使用する場合は、以下のように、パイプでデータを引き渡して実行することが多い。<br>
以下の例でのように、処理対象データから予め不要な部分を取り除いた上でawkに引き渡すことで、awkを簡素に記述することができる。<br>
head -n 3 shuffle.txt | awk '{ print $2 }'
ABC
DEF
GHI
<br>
<u>※備考</u><br>
<u>awkはコマンドではなく、インタプリタでありシェルスクリプトとは異なるスクリプト言語である。</u><br>
<u>元々、テキスト処理のために開発されたスクリプト言語であるため、シェルスクリプトよりも高速にテキスト処理を行うことができる。</u><br>
<br>
<u>awkはシェルスクリプトに組み込むことが容易であるため、awkのみで使用するよりもシェルスクリプト内でフィルタとして使用されることが多い。</u><br>
<u>シェルスクリプトで行数の多いテキストファイルを処理する場合、一部にawkを使用することで高速なプログラムを記述することができる。</u><br>
<br>
<u>テキストファイルの処理にはPerl等を使用した方が便利な場合もあるが、Perl等が使用できない環境ではawkを使用する方がよい。</u><br>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]]
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]]

案内メニュー