12,788
回編集
編集の要約なし |
(→printf) |
||
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]] |