web-dev-qa-db-ja.com

awkのデフォルトのフィールド区切り文字

この愚かな質問で申し訳ありませんが、検索されましたが、正しい答えが見つかったと確信していないので、デフォルトのセパレータはawkのスペースだけですか?

20
Lin Ma

質問_the default delimiter is only space for awk?_はあいまいですが、あなたが尋ねる可能性のある両方の質問に答えようとします。

FS変数のデフォルト値(これは、読み取り時にレコードをフィールドに分割する方法をawkに指示するフィールド区切り文字を保持します)は、単一のスペース文字です。

Awkがレコードをフィールドに分離するために使用するのは、「フィールドセパレーター」です。これは、フィールドセパレーターが単一のブランク文字である場合にのみ適用される追加機能を備えた正規表現です。その追加機能は次のとおりです。

  1. フィールドの分割中、先頭と末尾の空白は無視されます。
  2. フィールドは、空白、タブ、改行を含む連続したスペース文字のチェーンで区切られます。
  3. リテラルブランク文字をフィールドセパレータとして使用する場合は、正規表現のようにスタンドアロンのリテラルブランク文字の代わりに_[ ]_として指定する必要があります。

入力の読み取り時にレコードをフィールドに分割するために使用されるフィールドセパレーターに加えて、他のコンテキストで使用されます。 split()の3番目の引数。したがって、どのコンテキストで文字列、正規表現、またはフィールドセップが必要かを知ることが重要であり、manページでそれぞれを明確に指定しています。

とりわけ、上記はこれを説明しています:

_$ echo ' a b c ' | awk '{printf "%d: <%s> <%s> <%s>\n", NF, $1, $2, $3}'
3: <a> <b> <c>
$ echo ' a b c ' | awk -F' ' '{printf "%d: <%s> <%s> <%s>\n", NF, $1, $2, $3}'
3: <a> <b> <c>
$ echo ' a b c ' | awk -F'[ ]' '{printf "%d: <%s> <%s> <%s>\n", NF, $1, $2, $3}'                              
5: <> <a> <b>
_

最初の2つが同じ出力を生成し、最後の2つが異なる理由を理解できない場合は、お問い合わせください。

11
Ed Morton

GNU awkのマニュアルページを見てみましょう:

FS —入力フィールド区切り文字、デフォルトではスペース。上記のFieldsを参照してください。

Fieldsセクションへ!

各入力レコードが読み取られると、gawkはFS変数の値をフィールド区切り文字として使用して、レコードをフィールドに分割します。 FSが単一の文字である場合、フィールドはその文字で区切られます。 FSがヌル文字列の場合、個々の文字は個別のフィールドになります。それ以外の場合、FSは完全な正規表現であることが期待されます。 FSが単一のスペースである特別な場合、フィールドはスペースやタブ、改行で区切られます

8
John Kugelman