【问题标题】:linux/unix convert delimited file to fixed widthlinux/unix 将分隔文件转换为固定宽度
【发布时间】:2018-01-31 00:56:22
【问题描述】:

我有一个需求,将分隔文件转换成定宽文件,具体如下。

输入文件示例:

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

【问题讨论】:

    标签: linux unix sh


    【解决方案1】:

    另一个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
    

    【讨论】:

      【解决方案2】:

      使用以下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
      

      【讨论】:

        猜你喜欢
        • 2014-05-19
        • 2012-02-08
        • 2016-02-29
        • 2019-08-05
        • 2015-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-19
        相关资源
        最近更新 更多