awkコマンドでエラーが発生しました

awkコマンドでエラーが発生しました

入力する:

123456.00|aswani|india|ap
23456.00|rani|us|tel
233|ramu|londan|vih

出力:

aswani|ap
rani|tel
ramu|vih

次のコマンドを使用してこの出力を取得しようとしています。

awk '{FS="|";OFS="|"}{print $2,$4}'

しかし、私が得た結果は次のとおりです。

|
rani|tel
ramu|vih

コマンドはライン 2 で実行されますが、ライン 1 では実行されません。最初の行で出力しようとしています。

ベストアンサー1

「BEGIN」ブロック内に最初のブロック(FSおよびOFS設定)を入れる必要があります。

awk 'BEGIN {FS="|";OFS="|"} {print $2,$4}'

「BEGIN」ブロックを実行します今後テキストの最初の行が処理されました。代わりに実行される別のブロックがあります。すべてただし、最初の行の場合、フィールドがすでに分割されているため、FS設定が遅すぎます。

別の方法は、awkコマンドラインオプションを使用してFSを設定することですが、まだOFSを処理する必要があります。

awk -F '|' '{OFS="|"; print $2,$4}'

または:

awk -F '|' -v OFS='|' '{print $2,$4}'

修正する:@Kusalanandaが指摘したように、awkいくつかの実装(BSD awkなど)は、FSがリセットされるとフィールドを再分割するため、「BEGIN」ブロックに設定する必要はありません。 GNU awk(通常はLinuxディストリビューションにあるもの)ではこれは起こらないので、行を分割する前にFSを設定する必要があります。

おすすめ記事