入力する:
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を設定する必要があります。