使用默认 FS 时,使用 GNU awk 可靠地进行 gensub():
$ 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
对于其他 awk,您需要使用 match() 和 substr() 而不是 gensub()。请注意,上面的变量 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,并将字段之间的所有其他连续空白压缩为一个单独的空白字符。
不要这样做:
awk '{$2="";sub(" "," ")}1' file
因为它有上面提到的空间压缩问题,并且依赖于单个空白的硬编码 FS(虽然是默认的,所以可能不是那么糟糕),但更重要的是,如果在 $1 之前有空格,它将删除其中一个而不是它在 1 美元和 2 美元之间增加的空间。
最后值得一提的是,在最新版本的 gawk 中,有一个名为 patsplit() 的新函数,它的工作方式与 split() 类似,但除了创建字段数组外,它还创建字段之间的空格数组。这意味着您可以在数组中操作字段和 then 之间的空格,因此如果您操作字段,您不必担心 awk 使用 OFS 重新编译记录。然后你只需要从数组中打印你想要的字段。有关更多信息,请参阅http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions中的patsplit() 。