2015-01-07 38 views
3

使用可用于庆典的工具,我怎么转换分隔的数据转换分隔的文件,以固定宽度的Linux

foo|bbbaaarrr|bazz 

到固定宽度的数据

foo  bbbaaarrrbazz  EOL 

我尝试使用列作为文档暗示我可以定义列宽,不起作用。 我敢肯定,这是使用sed或awk的微不足道,但我不熟悉它们。

+0

向我们展示一些示例输入和所需的输出。 –

+1

1)列的宽度是否相同? 2)如果一个值超出列宽,你期望什么? – rici

+0

输入列将是不同的宽度,我强制输出是相同的宽度。我的期望是,它应该会非常壮观,因为输入数据是严格定义的(这就是为什么我不知道为什么他们坚持用这种格式来交换这些数据) –

回答

10

以下应为你工作:

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 

http://man7.org/linux/man-pages/man1/column.1.html


编辑:

如果需要每个字段是固定长度,则可以使用awk为该。你需要设置输入分隔符为您的文件,但这样的事情应该工作:

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

只要改变在printf语句中指定的字段宽度。

+0

这就是我认为的,使用-c来定义列宽度。没有工作,其他手册页意味着-c定义了列数。我认为专栏只是一种类型的预报。在你的例子中,列的宽度由最长参数的宽度来定义。 –

+1

@RickDeBay - 查看编辑。如果您需要将字段截断为拟合,您还需要使用'substr($ i,1,your_len_here)'而不是'$ i'。 –

+1

一个小小的改进(假设需要截断):将宽度作为参数传递:'awk -F'|' -v w = 9'{for(i = 1; i <= NF; i ++)printf“% - * s”,w,substr($ i,1,w);打印“”}'文件' –

相关问题