26616


`,` を区切り文字にした場合と、 ``(空白) を区切り文字にした場合で `awk` の挙動が異なることに気がつきました。

具体的には、空白の場合には複数の空白文字をひとつの区切りとして取り扱いますが、 `,` の場合には、`,`
が連続していてもそれぞれの文字が別々の区切りとして取り扱われています。

この挙動の差異は、何によって決定されていますか？具体的には、どの文字だと一塊区切りになり、どの文字だと別々区切りになりますか？

スクリプト例:

[code]

    #!/bin/bash
    
    printf 'a,,,b\n' | awk -F, '{print $2}'
    # => output empty
    
    printf 'a   b\n' | awk '{print $2}'
    # => output b
    
    printf 'a   b\n' | awk -F' ' '{print $2}'
    # => output b
    
    printf 'a   b\n'
    # => output a   b
    
[/code]


CC BY-SA 3.0
2016-06-10T07:23:47.117
26615
2016-06-10T07:40:04.110
754
question
awk
awk で複数の separator を一塊としてみなすかどうかは何で決まる？


空白一文字を与えた場合には特別な扱いとなり、行頭と行末の空白文字は削除されて、1個以上の空白がFSになります。より詳しくは、[POSIXのドキュメント](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html)
や `man awk` を参照してみてください。


CC BY-SA 3.0
2016-06-10T07:34:12.563
26616
2016-06-10T07:34:12.563
76
26615
answer


gawk ですが… `-F` は正規表現を受け付けますので次のようにすれば `,` と同様の動作になりました。

[code]

    $ printf 'a   b\n' | awk -F' {1}' '{print $2}'
    
[/code]

これから推測すると、`-F' '` の場合は空白文字の繰返しの正規表現に内部的に置き換わってるのかなという気がします。


CC BY-SA 3.0
2016-06-10T07:40:04.110
26618
2016-06-10T07:40:04.110
5008
26615
answer