使用默认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(),但除了创建字段数组外,它还创建了字段之间的空间数组。这意味着您可以在数组中操作字段和字段之间的空格,因此,如果您操作字段,则不必担心awk使用OFS重新编译记录。然后,只需从数组中打印所需的字段即可。有关更多信息,请参见
http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions中的patsplit()。