使用可用于庆典的工具,我怎么转换分隔的数据转换分隔的文件,以固定宽度的Linux
foo|bbbaaarrr|bazz
到固定宽度的数据
foo bbbaaarrrbazz EOL
我尝试使用列作为文档暗示我可以定义列宽,不起作用。 我敢肯定,这是使用sed或awk的微不足道,但我不熟悉它们。
使用可用于庆典的工具,我怎么转换分隔的数据转换分隔的文件,以固定宽度的Linux
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
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
语句中指定的字段宽度。
这就是我认为的,使用-c来定义列宽度。没有工作,其他手册页意味着-c定义了列数。我认为专栏只是一种类型的预报。在你的例子中,列的宽度由最长参数的宽度来定义。 –
@RickDeBay - 查看编辑。如果您需要将字段截断为拟合,您还需要使用'substr($ i,1,your_len_here)'而不是'$ i'。 –
一个小小的改进(假设需要截断):将宽度作为参数传递:'awk -F'|' -v w = 9'{for(i = 1; i <= NF; i ++)printf“% - * s”,w,substr($ i,1,w);打印“”}'文件' –
向我们展示一些示例输入和所需的输出。 –
1)列的宽度是否相同? 2)如果一个值超出列宽,你期望什么? – rici
输入列将是不同的宽度,我强制输出是相同的宽度。我的期望是,它应该会非常壮观,因为输入数据是严格定义的(这就是为什么我不知道为什么他们坚持用这种格式来交换这些数据) –