Вы можете сделать это преобразование несколькими способами, некоторые из них:
$ (head -n -1 - | tr \\n, ;cat -;) < inp
$ perl -lp -0777e 'chop;tr/\n/,/' inp
$ awk '$1=$1' FS="\n" RS= OFS=, inp
$ awk '{
p = $0
while ( getline > 0 ) p = p RS $0
$0 = p
gsub(/\n/, ",")
}1' inp
POSIX -СЭД:
$ sed -e '
:a
${s/\n/,/g;q;}
N;ba
' inp
ГНУ -СЭД:
$ sed -e '
$!{
N
s/^/\n/;D
}
y/\n/,/
' inp
$ perl -0777 -pe 's/\n(?!\z)/,/g' inp
$ perl -lpe '$\ = eof ? $/ : ","' inp
Вы не предоставили ожидаемый результат, но похоже, что это может быть то, что вы пытаетесь сделать, т. е. указать формат для 1 поля вывода, но использовать форматирование по умолчанию для многих других, не указывая формат для все поля в строке форматирования printf:
$ printf 'bar\t5\n' | awk '{print sprintf("%.3f",$2),"baz",$1}'
5.000 baz bar
или:
$ printf 'bar\t5\n' | awk '{$3=$1; $1=sprintf("%.3f",$2); $2="baz"} 1'
5.000 baz bar
Команда printf
требует, чтобы все строки формата шли первыми, по одной %
на выходной столбец, а затем вы можете ссылаться на столбцы из ввода, по одной ,
на столбец:
$ printf bar\\t5 | awk '{printf "%.3f,%4s|%s\n", $2,"baz",$1}'
5.000, baz|bar
Необходимо, чтобы в строке формата было указано точно такое же количество выходных столбцов, сколько входных столбцов после строки формата, иначе вы получите ошибку (в этом примере, выходной формат имеет три столбца, а есть только два входных столбца):
$printf bar\\t5 | awk '{printf "%.3f,%4s|%s\n", $2,"baz"}'
awk: cmd. line:1: (FILENAME=- FNR=1) fatal: not enough arguments to satisfy format string
`%.3f,%4s|%s
'
^ ran out for this one
Разделители в строке формата являются буквальными, а запятые используются после строки формата для разграничения входных столбцов.