Один из возможных ответов (при условии, фиксированное число столбцов):
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 или тому подобное?
ТНХ :), что я искал. – name