Распечатать оставшиеся поля в awk

Предположим, что у нас есть этот файл данных.

john 32 maketing executive
jack 41 chief technical officer
jim  27 developer
dela 33 assistant risk management officer

Я хочу распечатать с помощью awk

john maketing executive
jack chief technical officer
jim  developer
dela assistant risk management officer

Я знаю, что это можно сделать с помощью for.

awk '{printf $1;  for(i=3;i<NF;i++){printf " %s", $i} printf "\n"}' < file

Проблема в том, что она длинна и выглядит сложной.

Есть ли другой короткий путь для печати остальных полей.

Ответ 2

Надежность с 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 и сжимает все остальные смежные пробелы между полями в один пробел char каждый.

Не делайте этого:

awk '{$2="";sub("  "," ")}1' file

поскольку у него есть проблема с пространственным сжатием, упомянутая выше, и полагается на жестко запрограммированную FS одного пустого (по умолчанию, хотя, может быть, и не так уж плохо), но что более важно, если бы существовали пробелы до 1 доллара, он удалял один из вместо пространства, добавляемого между $1 и $2.

Последнее, что стоит упомянуть, это то, что в последних версиях gawk есть новая функция patsplit(), которая работает как split(), но в дополнение к созданию массива полей, она также создает массив пробелов между поля. Это означает, что вы можете манипулировать полями и промежутками между ними в массивах, поэтому вам не нужно беспокоиться о том, что awk перекомпилирует запись, используя OFS, если вы манипулируете полем. Затем вам просто нужно напечатать нужные поля из массивов. Для получения дополнительной информации см. Patsplit() в http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions.

Ответ 3

Это удаляет файл # 2 и очищает дополнительное пространство.

awk '{$2="";sub("  "," ")}1' file

Ответ 4

Вы можете использовать простой awk, например:

awk '{$2=""}1' file

Однако это будет иметь дополнительные OFS в вашем выходе, которые можно избежать с помощью этого awk

awk '{sub($2 OFS, "")}1' file

ИЛИ иначе, используя эту команду tr и cut:

В Linux:

tr -s ' ' < file | cut -d ' ' -f1,f3-

В OSX:

tr -s ' ' < file | cut -d ' ' -f1 -f3-

Ответ 5

Другой способ - просто использовать sed для замены первых цифр и пробелов:

sed 's|[0-9]\+\s\+||' file