Удалить столбец с awk или sed

У меня есть файл с тремя столбцами. Я хотел бы удалить третий столбец (редактирование на месте). Как это сделать с помощью awk или sed?

123   abc  22.3
453   abg  56.7
1236  hjg  2.3

Требуемый вывод

123  abc
453  abg
1236 hjg 

Ответ 1

Это может сработать для вас (GNU sed):

sed -i -r 's/\S+//3' file

Если вы хотите удалить пробел перед третьим полем:

sed -i -r 's/(\s+)?\S+//3' file

Ответ 2

попробуйте эту короткую вещь:

awk '!($3="")' file

Ответ 3

С GNU awk для редактирования inplace \s/\S и gensub() удалить

1) поле FIRST:

awk -i inplace '{sub(/^\S+\s*/,"")}1' file

или

awk -i inplace '{$0=gensub(/^\S+\s*/,"",1)}1' file

2) поле LAST:

awk -i inplace '{sub(/\s*\S+$/,"")}1' file

или

awk -i inplace '{$0=gensub(/\s*\S+$/,"",1)}1' file

3) поле N th где N = 3:

awk -i inplace '{$0=gensub(/\s*\S+/,"",3)}1' file

Без GNU awk вам понадобится комбинация match() + substr() или несколько sub() + vars для удаления среднего поля. См. Также Печать всех, кроме первых трех столбцов.

Ответ 4

Кажется, вы могли бы просто пойти с

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

Это печатает два первых поля каждой строки в вашем входном файле, разделенные пробелом.

Ответ 5

Попробуйте следующее:

awk '$3="";1' file.txt > new_file && mv new_file file.txt

или

awk '{$3="";print}' file.txt > new_file && mv new_file file.txt

Ответ 6

GNU awk 4.1

awk -i inplace NF--

Это приведет к удалению последнего поля каждой строки.

Ответ 7

Попробуйте использовать разрез... его быстрый и легкий

Сначала у вас есть повторяющиеся пробелы, вы можете сжать их до одного пробела между столбцами, если это то, что вы хотите с помощью tr -s ' '

Если у каждого столбца есть только один разделитель между ним, вы можете использовать cut -d ' ' -f-2 для печати полей (столбцов) <= 2.

например, если ваши данные находятся в файле input.txt, вы можете выполнить одно из следующих действий:

cat input.txt | tr -s ' ' | cut -d ' ' -f-2

Или, если вам лучше рассуждать об этой проблеме, удалив третий столбец, вы можете написать следующее

cat input.txt | tr -s ' ' | cut -d ' ' --complement -f3

cut довольно мощный, вы также можете извлекать диапазоны байтов или символов в дополнение к столбцам

выдержка из man-страницы в синтаксисе того, как указать диапазон списка

Each LIST is made up of one range, or many ranges separated by commas.
Selected input is written in the same order that it is read, and is
written exactly once. Each range is one of:

  N     N'th byte, character or field, counted from 1
  N-    from N'th byte, character or field, to end of line
  N-M   from N'th to M'th (included) byte, character or field
  -M    from first to M'th (included) byte, character or field

чтобы вы могли сказать, что вам нужны конкретные столбцы 1 и 2 с...

cat input.txt | tr -s ' ' | cut -d ' ' -f1,2