使用printf格式化两列宽度

时间:2018-02-07 18:19:15

标签: bash awk printf alignment

我有一个包含两列的文件:

73697695 1111111100110100211010101100000110100111  
73697715 0100001010100022000020000000000200200000  
73698148  0000000000200000000200220001100100010111  
73698210 1111111211011012001011000001111000001110  
73698229 1111111100110111110020101000000111210011  
736985237658373533  0000000110100011101010000001100100100000  
73698858 1111111210010011101010000001100100100111  
73698887 2222222200020000202000000010001100110000  
73699163 2222222200020100110110211100000100100100  
7369929986423  2222222200020100110110211100000011110111  

我正在尝试创建一个bash文件来格式化其列。首先,我需要找到第一列的最大长度。所以,我这样做了:

lengthID=$(awk '{ if (length($1) > max) max = length($1) } END { print max }' file)

之后我想申请#34; lengthID"到这样的文件,根据" lengthID"将第一列对齐到右边。第二列必须与左侧对齐。我尝试使用以下命令行,但它不起作用。

awk '{printf("%"lengthID"s%1s%" "s\n",$1," ",$2)}' file > temp && mv temp file

我知道最大长度是18(lengthID = 18)。因此,以下命令将起作用:

awk '{printf("%18s%1s%" "s\n",$1," ",$2)}' file > temp && mv temp file

我会得到这样的文件(正是我需要的)。但是,我想自动找到这样的长度并使用它。

          73697695 1111111100110100211010101100000110100111
          73697715 0100001010100022000020000000000200200000
          73698148 0000000000200000000200220001100100010111
          73698210 1111111211011012001011000001111000001110
          73698229 1111111100110111110020101000000111210011
736985230909090909 0000000110100011101010000001100100100000
          73698858 1111111210010011101010000001100100100111
          73698887 2222222200020000202000000010001100110000
          73699163 2222222200020100110110211100000100100100
     7369929986423 2222222200020100110110211100000011110111

有没有人知道这样做的方法?

谢谢。

1 个答案:

答案 0 :(得分:1)

$ awk 'NR==FNR{c=length($1); w=(w>c?w:c); next} {printf "%*s %s\n", w, $1, $2}' file file
          73697695 1111111100110100211010101100000110100111
          73697715 0100001010100022000020000000000200200000
          73698148 0000000000200000000200220001100100010111
          73698210 1111111211011012001011000001111000001110
          73698229 1111111100110111110020101000000111210011
736985237658373533 0000000110100011101010000001100100100000
          73698858 1111111210010011101010000001100100100111
          73698887 2222222200020000202000000010001100110000
          73699163 2222222200020100110110211100000100100100
     7369929986423 2222222200020100110110211100000011110111

你确定不能只使用column -t file吗?

$ column -t file
73697695            1111111100110100211010101100000110100111
73697715            0100001010100022000020000000000200200000
73698148            0000000000200000000200220001100100010111
73698210            1111111211011012001011000001111000001110
73698229            1111111100110111110020101000000111210011
736985237658373533  0000000110100011101010000001100100100000
73698858            1111111210010011101010000001100100100111
73698887            2222222200020000202000000010001100110000
73699163            2222222200020100110110211100000100100100
7369929986423       2222222200020100110110211100000011110111

对齐方式不同,但如果您只需要视觉列,那可能就行了。

相关问题