正規表現を区切り文字として使用する awk

正規表現を区切り文字として使用する awk

ファイルから各行の最初の単語を取得したいと思います。残念ながら、多くの行が空白で始まります。だから私は次の最初の単語を取得しようとしました。

awk -F'[ \t]+' '{print $1}' < MyFile.txtしかし、うまくいきません。これを試しましたが、echo " some string: here" | awk -F'[ \t]+' '{print $1}'結果は空行です(空の文字列が印刷されているようです)。では、なぜこれがうまくいかないのですか? awkコマンドで動作させ、区切り文字を明示的に渡したい(教育目的で)。

よろしくお願いします。

答え1

少なくともスペースまたはタブで構成される Awk のフィールド区切り文字を指定します。

Awkに文字列を入力some string: hereして最初のフィールドを印刷するように要求します。

最初のフィールドが空であるため、出力は出ません。

この文字列のフィールドは次のとおりです。

<1:>   <2:some> <3:string:> <4:here>
$ echo '   some string: here' | gawk 'BEGIN {OFS="|";FS="[ \t]+"}{print $1,$2,$3,$4}'
|some|string:|here

カンマで区切られた入力データを使用する方が明白です。

,some,string:,here

区切り文字を指定しないと、Awkは連続したスペースおよび/またはタブを区切り文字として使用します。また、行の両側にスペース文字がある場合いいえ行をフィールドに分割するときに考慮する必要があります。


入力がJSONまたはYAMLの場合は、Awkを使用する代わりに、これらの構造化文書形式を解析するのに適したツールを使用することをお勧めします。これらのツールの提案にはjq、、、yqおよびmlrその他jtcが含まれます。

答え2

awkでは、デフォルトのフィールド区切り文字を使用する-F " "か、BEGIN{FS=" "}特別な規則に従います。

  • (1) 初期スペースと最後のスペースを無視します。
  • (2) 分割[ \t]+

ポイント(1) -先行および末尾のスペースを無視-フィールド区切り文字が次の場合にのみ " "

この動作は実際に私たちが期待するものです。

基本的なawk '{print $1}'タスクを検索する場合も同様ですawk -F' ' '{print $1}'


入力レコード区切り記号(RS)には別の同様の規則があります。RS="" 段落区分を表す場合:

  • (1) 区切り文字は、1 つ以上の空行です。
  • (2) 最初と最後の空行を無視します。

ポイント(2) - 前/後の空白行を無視してください -入力レコード区切り文字が正確に""の場合にのみ適用されます。

答え3

awkフィールドを割り当てると、先頭のスペースは無視され、デフォルトのコマンドはprintです。だからこれはうまくいきます:

awk '{print $1}'

関連情報