Linux 使用 awk 对齐文本文件中的列?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14095011/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 18:09:04  来源:igfitidea点击:

Using awk to align columns in text file?

linuxbashawk

提问by Sandra Schlichting

Would awkbe useful to convert "Input" to "Desired output"?

awk被转换成“输入”有用的“所需的输出”?

Input

输入

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)

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)

采纳答案by Chris Seymour

A trick to align right using columnis to use rev:

使用正确对齐的技巧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)

回答by Mike Sherrill 'Cat Recall'

Yes. Look at the syntax for awk's printf() function. Abbreviated sample code . . .

是的。查看 awk 的 printf() 函数的语法。缩写示例代码。. .

{
  printf("%s %2s ", , );
  printf("%4s %s %s ", , , );
  printf("%4s %s %s ", , , );
  printf("%7s\n", );
}

Output.

输出。

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

Docs for GNU awk's printf().

GNU awk 的 printf() 文档

There are several ways to pass the "heading" through unmodified. This way assumes it's always on the first line of the file.

有几种方法可以通过未修改的“标题”传递。这种方式假设它总是在文件的第一行。

NR==1 { print 
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
} NR>1 { printf("%s %2s ", , ); printf("%4s %s %s ", , , ); printf("%4s %s %s ", , , ); printf("%7s\n", ); }

回答by Ed Morton

##代码##