Достоверно с GNU AWK для gensub() при использовании FS по умолчанию:
$ 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 вам нужно использовать 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
как это hasthe вопрос пространственно-сжатия, упомянутых выше, и опирается на жестко прописанных ФС одной пустой (по умолчанию, хотя, так что, возможно, не так уж плохо), но что более важно, если бы существовали пробелы до 1 доллара, он удалял один из них вместо пространства, добавляемого между $ 1 и $ 2.
Следует упомянуть, что в последних версиях gawk есть новая функция patsplit(), которая работает как split(), но в дополнение к созданию массива полей, она также создает массив пространств между полями. Это означает, что вы можете манипулировать полями и промежутками между ними в массивах, поэтому вам не нужно беспокоиться о том, что awk перекомпилирует запись, используя OFS, если вы манипулируете полем. Затем вам просто нужно напечатать нужные поля из массивов. См. Patsplit() в http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions для получения дополнительной информации.
Простой взлом - установить $ 2 на "", а затем напечатать $ 0 (все поля), хотя это даст вам дополнительный разделитель для пустого поля. – mkfs
Через 3 года ты помог мне. Но вы должны изменить «
Koreth