Использование awk '{printf...' нескольких столбцов

Вы можете сделать это преобразование несколькими способами, некоторые из них:

$ (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
0
16.04.2021, 02:10
2 ответа

Вы не предоставили ожидаемый результат, но похоже, что это может быть то, что вы пытаетесь сделать, т. е. указать формат для 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
1
28.04.2021, 22:52

Команда 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

Разделители в строке формата являются буквальными, а запятые используются после строки формата для разграничения входных столбцов.

1
28.04.2021, 22:52

Теги

Похожие вопросы