在Linux中将分隔文件转换为固定宽度

在Linux中将分隔文件转换为固定宽度,linux,bash,Linux,Bash,使用bash可用的工具,如何转换分隔数据 foo|bbbaaarrr|bazz 到固定宽度数据 foo bbbaaarrrbazz EOL 我尝试使用列,因为文档暗示我可以定义列宽,但没有成功。 我确信使用sed或awk时这很简单,但我不熟悉它们。以下内容应该适合您: column -t -s '|' input_file_here 它将把输入文件转换成表格格式。输入记录分隔符由-s指定。如果字段中不需要空格填充,请使用-o设置输出分隔符。输出分隔符默认为两个空格,

使用bash可用的工具,如何转换分隔数据

foo|bbbaaarrr|bazz
到固定宽度数据

foo      bbbaaarrrbazz     EOL   
我尝试使用列,因为文档暗示我可以定义列宽,但没有成功。
我确信使用sed或awk时这很简单,但我不熟悉它们。

以下内容应该适合您:

column -t -s '|' input_file_here
它将把输入文件转换成表格格式。输入记录分隔符由
-s
指定。如果字段中不需要空格填充,请使用
-o
设置输出分隔符。输出分隔符默认为两个空格,因此输出中的每列之间将有两个空格

示例:

$ cat input
hello|world|testing
a|b|c
another|test|line

$ column -t -s '|' input
hello    world  testing
a        b      c
another  test   line


编辑:

如果需要将每个字段设置为固定长度,可以使用
awk
。您需要为文件设置输入分隔符,但类似的操作应该可以:

$ awk -F '|' '{ for (i=1; i<=NF; i++) { printf("%-10s", $i); } print ""; }' input
hello     world     testing
a         b         c
another   test      line

$awk-F'|'{for(i=1;i显示一些示例输入和所需输出。1)所有列的宽度都相同吗?2)如果某个值超过列宽,您的期望值是多少?输入列的宽度将不同,我强制输出为相同的宽度。我的期望值是,它将以惊人的速度消亡,因为输入数据是严格定义的(这就是为什么我不知道他们为什么坚持这种格式来交换数据的原因)这就是我的想法,使用-c定义列宽。不起作用,其他手册页暗示-c定义列数。我认为列只是一种预处理器。在您的示例中,列宽是由最长参数的宽度定义的。@RickDeBay-请参阅编辑。如果您需要字段截断为拟合,您还需要我们e
substr($i,1,这里是你的列名)
而不仅仅是
$i
。一个小的改进(假设需要截断):将宽度作为参数传递:
awk-F'|'-vw=9'{for(i=1;iPerfect)。我预先准备了一个测试来排除第一行。不知道为什么人们觉得需要从列名列表开始。