linux / unix将分隔文件转换为固定宽度

时间:2018-01-30 16:16:49

标签: linux unix sh

我需要将分隔文件转换为固定宽度文件,详情如下。

输入文件示例:

AAA|BBB|C|1234|56
AA1|BB2|DD|12345|890

输出文件示例:

AAA  BBB   C   1234  56  
AA1  BB2   DD  12345 890

现场职位详情

  • 字段1从位置1开始,长度应为5
  • 字段2从位置6开始,长度应为6
  • 字段3从位置12开始,长度应为4
  • 字段4从位置16开始,长度应为6
  • 字段5从位置22开始,长度应为3

2 个答案:

答案 0 :(得分:0)

使用以下awk命令,您可以实现目标:

awk 'BEGIN { RS=" "; FS="|" } { printf "%5s%6s%4s%6s%3s\n",$1,$2,$3,$4,$5 }' your_input_file

您的记录分隔符(RS)是一个空格,您的字段分隔符(FS)是一个管道(|)字符。为了正确地解析数据,我们在BEGIN语句中设置它们(在读取任何数据之前)。然后使用printf和所需的格式字符,我们以所需的格式输出数据。

<强> 输出:

  AAA   BBB   C  1234 56
  AA1   BB2  DD 12345890

<强> 更新

我刚刚看到您对输入文件格式的编辑(以前它们看起来不同)。如果您的输入数据记录使用新行分隔,则只需从上面的单行中移除RS=" ";部分,然后对格式字符应用-修饰符以对齐您的字段:

awk 'BEGIN { FS="|" } { printf "%-5s%-6s%-4s%-6s%-3s\n",$1,$2,$3,$4,$5 }' your_input_file

答案 1 :(得分:0)

另一个awk解决方案:

echo -e "AAA|BBB|C|1234|56\nAA1|BB2|DD|12345|890" | 
awk -F '|' '{printf "%-5s%-6s%-4s%-6s%-3s\n",$1,$2,$3,$4,$5}'

请注意printf语句中-之前的%-3s,它会根据问题的要求左对齐字段。输出:

AAA  BBB   C   1234  56 
AA1  BB2   DD  12345 890