Использование awk для выравнивания столбцов в текстовом файле?
Может ли awk
преобразовать "Input" в "Desired output"?
Ввод
testing speed of encryption
test 0 (64 bit key, 16 byte blocks): 2250265 operations in 1 seconds (36004240 bytes)
test 1 (128 bit key, 64 byte blocks): 879149 operations in 1 seconds (56265536 bytes)
test 2 (128 bit key, 256 byte blocks): 258978 operations in 1 seconds (66298368 bytes)
test 3 (128 bit key, 1024 byte blocks): 68218 operations in 1 seconds (69855232 bytes)
test 4 (128 bit key, 8192 byte blocks): 8614 operations in 1 seconds (70565888 bytes)
test 10 (256 bit key, 16 byte blocks): 1790881 operations in 1 seconds (3654096 bytes)
Желаемый вывод
testing speed of encryption
test 0 (64 bit key, 16 byte blocks): 2250265 operations in 1 seconds (36004240 bytes)
test 1 (128 bit key, 64 byte blocks): 879149 operations in 1 seconds (56265536 bytes)
test 2 (128 bit key, 256 byte blocks): 258978 operations in 1 seconds (66298368 bytes)
test 3 (128 bit key, 1024 byte blocks): 68218 operations in 1 seconds (69855232 bytes)
test 4 (128 bit key, 8192 byte blocks): 8614 operations in 1 seconds (70565888 bytes)
test 10 (256 bit key, 16 byte blocks): 1790881 operations in 1 seconds (3654096 bytes)
Ответы
Ответ 1
Трюк для выравнивания с помощью column
заключается в использовании rev
:
$ head -1 file; tail -n+2 file | rev | column -t | rev
testing speed of encryption
test 0 (64 bit key, 16 byte blocks): 2250265 operations in 1 seconds (36004240 bytes)
test 1 (128 bit key, 64 byte blocks): 879149 operations in 1 seconds (56265536 bytes)
test 2 (128 bit key, 256 byte blocks): 258978 operations in 1 seconds (66298368 bytes)
test 3 (128 bit key, 1024 byte blocks): 68218 operations in 1 seconds (69855232 bytes)
test 4 (128 bit key, 8192 byte blocks): 8614 operations in 1 seconds (70565888 bytes)
test 10 (256 bit key, 16 byte blocks): 1790881 operations in 1 seconds (3654096 bytes)
Ответ 2
Да. Посмотрите на синтаксис функции awk printf(). Сокращенный образец кода.,.
{
printf("%s %2s ", $1, $2);
printf("%4s %s %s ", $3, $4, $5);
printf("%4s %s %s ", $6, $7, $8);
printf("%7s\n", $9);
}
Выход.
test 0 (64 bit key, 16 byte blocks): 2250265
test 1 (128 bit key, 64 byte blocks): 879149
test 2 (128 bit key, 256 byte blocks): 258978
test 3 (128 bit key, 1024 byte blocks): 68218
test 4 (128 bit key, 8192 byte blocks): 8614
test 10 (256 bit key, 16 byte blocks): 1790881
Документы для GNU awk printf().
Существует несколько способов передать "заголовок" через немодифицированный. Этот способ предполагает, что он всегда находится в первой строке файла.
NR==1 { print $0}
NR>1 {
printf("%s %2s ", $1, $2);
printf("%4s %s %s ", $3, $4, $5);
printf("%4s %s %s ", $6, $7, $8);
printf("%7s\n", $9);
}
Ответ 3
awk '
FNR==1 { if (NR==FNR) print; next }
NR==FNR {
for(i=1;i<=NF;i++)
w[i] = (w[i] <= length($i) ? length($i) : w[i])
next
}
{
for(i=1;i<=NF;i++)
printf "%*s",w[i]+(i>1?1:0),$i
print ""
}
' file file