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