Ответ 1
Задайте поле (ы), которое вы хотите пропустить до пробела:
awk '{$2 = ""; print $0;}' < file_name
Источник: Использование awk для печати всех столбцов с n-го до последнего
Предположим, что у нас есть этот файл данных.
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
Проблема в том, что она длинна и выглядит сложной.
Есть ли другой короткий путь для печати остальных полей.
Задайте поле (ы), которое вы хотите пропустить до пробела:
awk '{$2 = ""; print $0;}' < file_name
Источник: Использование awk для печати всех столбцов с n-го до последнего
Надежность с 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.
Это удаляет файл # 2 и очищает дополнительное пространство.
awk '{$2="";sub(" "," ")}1' file
Вы можете использовать простой 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-
Другой способ - просто использовать sed для замены первых цифр и пробелов:
sed 's|[0-9]\+\s\+||' file