2010-07-02 3 views
1

$ echo "a b" | awk '{print $ 0; $ 1 = "1"; печать $ 0}» а б 1 бизменение содержания колонны без разрушения формирования

Я хотел бы получить форматированный вывод так:

a  b 
1  b 

Есть ли простой способ сделать это (без МФСА, OFS изменение)? Я меняю колонны в большом столе, а потом выглядит уродливо. Я не хочу переформатировать каждый столбец.

Спасибо.

ответ

2

Возможно, ваш лучший выбор - постпроцессорный выход. Возможно, что-то простое:

 
$ ... | awk ... | column -t 

будет работать. (Если «Я не хочу форматировать каждый столбец» означает «Я не хочу переформатировать каждую строку», например «Я не хочу публиковать процесс». В таком случае я бы спросил: «Почему бы и нет? «)

+0

ТНХ :), что я искал. – name

2

Один из возможных ответов (при условии, фиксированное число столбцов):

echo "a  b" | awk '{print $0; $1="1"; printf("%s\t%s\n", $1, $2)}' 

Другой возможный ответ (если у вас нет уважительной причины, чтобы избежать изменения OFS так, вы знаете, что это целая точка с одним!):

echo "a  b" | awk 'BEGIN { OFS="\t" } {print $0; $1="1"; print $0}' 

Эта вторая имеет то преимущество, что работает независимо от того, сколько столбцов ваш текстовый файл есть.


Edited добавить:

Чтобы объяснить, почему я думаю, что ваше отвращение к используя OFS причудливо, это только, что вся причина, вы получаете, что изменение форматирования потому из OFS. Сепаратор выходных полей (OFS) по умолчанию является единственным пробелом. Когда вы печатали $ 0 в первый раз, вы не делали никаких изменений, поэтому $ 0 была неизменной. Изменив одну из записей, которые вы сделали, Awk проведет переоценку строки, повторно собрав $ 0 из отдельных полей. После повторной сборки, конечно, Awk вставил OFS между полями. Потому что это то, что он должен делать. Цитата из соответствующих людей страницы (человек простака):

Присвоение значения существующего поля вызывает все записи, чтобы быть восстановлена, когда $0 ссылаются. Аналогично, присвоение значения $0 заставляет запись повторно сортировать, создавая новые значения для полей.

Теперь я согласен, что существует некоторая несогласованность между первой печатью, а вторая обрабатывает поля по-разному, но это так, как язык. OFS не вставлен до тех пор, пока вы на самом деле не измените строку, и она фактически вычисляет поля и перестроения и так далее.


Далее отредактированный, чтобы добавить:

Смотреть это:

$ awk 'BEGIN { printf("|%s|\n", OFS) }' 
| | 
$ awk 'BEGIN { OFS="\t" ; printf("|%s|\n", OFS) }' 
| | 
$ 

Является ли поведение Awk в первом примере становится яснее, а также понять, почему вы на самом деле нужно, что OFS или printf или тому подобное?

+0

THX для ответа. Это действительно приносит понимание проблемы. – name

1

вы также можете использовать подстановку

$ echo "a  b" | awk '{print $0; gsub("^[^ \t]","1"); print $0}' 
a  b 
1  b 
+0

Это то, что я сделал в начале, но «| column -t» - лучший способ. Я могу изменить любые столбцы, которые я хочу, и в конце по-прежнему имеет хорошую таблицу в формате. – name

Смежные вопросы