Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
34
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

AWK のフィールドセパレータの真実

という内容を社内 SNS っぽいところに投稿したところ、次のようなツッコミがありました。

大抵の環境では gawk が入っているので区切り文字に正規表現が指定できるようですね。

cat hoge.log | awk -F',+' '{print $2}'

なん・・だと・・

そこ、正規表現だったの??

じゃあ awk -F'.' とか、超使い方間違えていたの? 死ぬの?


man awk 曰く(Fields の辺り)。

If FS is a single character, fields are separated by that character.
If FS is the null string, then each individual character becomes a separate field.
Otherwise, FS is expected to be a full regular expression.
In the special case that FS is a single space, fields are separated by runs of spaces and/or tabs and/or newlines.

意訳。

  • 単一の文字なら、フィールドはその文字で句切られる
  • 空文字列なら、それぞれの文字が別々のフィールドになる(1文字ずつのフィールドになる)
  • それ以外なら正規表現になる
  • 特殊なケースで、単一のスペースなら、空白/タブ/改行、のいずれかで区切られる

なるほど。

$ cat <<EOS> hoge.txt
aaa.123 xxx
bbb.456 yyy
ccc.789 zzz
EOS

1文字なら只の文字。

$ cat hoge.txt | awk -F. '{print $2}'
123 xxx
456 yyy
789 zzz

2文字以上なら正規表現。

$ cat hoge.txt | awk -F'[0-9]+' '{print $1}'
aaa.
bbb.
ccc.

空文字なら文字ごとに区切り。

$ cat hoge.txt | awk -F '' '{print $6}'
2
5
8

単一のスペースなら空白/タブ/改行。

$ cat hoge.txt | awk -F ' ' '{print $1}'
aaa.123
bbb.456
ccc.789

最後のケースはレコードセパレータも変えるとわかりやすい。

$ cat <<EOS> hoge.txt
aaa
bbb
ccc
.
123 456 789
.
xxx
yyy
zzz
EOS

$ cat hoge.txt | awk -F ' ' -v RS=. '{print $2}'
bbb
456
yyy

awk -F'.' は無事だった・・よかった。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
34
Help us understand the problem. What are the problem?