在Linux中将分隔文件转换为固定宽度
使用bash可用的工具,如何转换分隔数据在Linux中将分隔文件转换为固定宽度,linux,bash,Linux,Bash,使用bash可用的工具,如何转换分隔数据 foo|bbbaaarrr|bazz 到固定宽度数据 foo bbbaaarrrbazz EOL 我尝试使用列,因为文档暗示我可以定义列宽,但没有成功。 我确信使用sed或awk时这很简单,但我不熟悉它们。以下内容应该适合您: column -t -s '|' input_file_here 它将把输入文件转换成表格格式。输入记录分隔符由-s指定。如果字段中不需要空格填充,请使用-o设置输出分隔符。输出分隔符默认为两个空格,
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-请参阅编辑。如果您需要字段截断为拟合,您还需要我们esubstr($i,1,这里是你的列名)
而不仅仅是$i
。一个小的改进(假设需要截断):将宽度作为参数传递:awk-F'|'-vw=9'{for(i=1;iPerfect)。我预先准备了一个测试来排除第一行。不知道为什么人们觉得需要从列名列表开始。