デフォルトの FS を使用する場合、gensub() の GNU awk で確実に:
$ gawk -v delNr=2 '{$0=gensub("^([[:space:]]*([^[:space:]]+[[:space:]]+){"delNr-1"})[^[:space:]]+[[:space:]]*","\\1","")}1' file
john maketing executive
jack chief technical officer
jim developer
dela assistant risk management officer
他の awks では、gensub() の代わりに match() と substr() を使用する必要があります。上記の変数 delNr は、削除するフィールドを awk に伝えることに注意してください。
$ gawk -v delNr=3 '{$0=gensub("^([[:space:]]*([^[:space:]]+[[:space:]]+){"delNr-1"})[^[:space:]]+[[:space:]]*","\\1","")}1' file
john 32 executive
jack 41 technical officer
jim 27
dela 33 risk management officer
こんなことしないで:
awk '{sub($2 OFS, "")}1'
$2 にある同じテキストが $1 の末尾にある可能性があるため、および/または $2 に RE メタ文字が含まれている可能性があるため、間違った文字列をそのように削除する可能性が非常に高くなります。
こんなことしないで:
awk '{$2=""}1' file
FS を追加し、フィールド間の他のすべての連続する空白をそれぞれ 1 つの空白文字に圧縮するためです。
こんなことしないで:
awk '{$2="";sub(" "," ")}1' file
上記のスペース圧縮の問題があり、単一の空白のハードコードされた FS に依存しているため (デフォルトですが、それほど悪くはないかもしれません)、さらに重要なことに、$1 の前にスペースがあった場合、代わりにそれらの 1 つを削除します。 $1 と $2 の間に追加するスペース。
言及する価値のある最後の 1 つのことは、gawk の最近のバージョンには、split() のように機能する patsplit() という名前の新しい関数があることですが、フィールドの配列を作成することに加えて、フィールド間のスペースの配列も作成します。つまり、配列内でフィールドとその間のスペースを操作できるため、フィールドを操作する場合に OFS を使用して awk がレコードを再コンパイルすることを心配する必要はありません。次に、配列から必要なフィールドを印刷するだけです。詳細については、 http: //www.gnu.org/software/gawk/manual/gawk.html#String-Functions の patsplit() を参照してください。