如何根据字段长度添加尾随空格

Abh*_*ngh 0 shell shell-script

我想为每个字段添加尾随空格。我的文件看起来像:

输入文件:

A|B|C|D
Run Code Online (Sandbox Code Playgroud)

输出文件中的字段 1 长度为: 1

输出文件中的字段 2 长度为: 3

输出文件中的字段 3 长度为: 4

输出文件中的字段 4 长度为: 6

期望的输出:

AB  C   D  
Run Code Online (Sandbox Code Playgroud)

如何在shell中实现这一点?请协助

Sté*_*las 6

awk

awk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}' < input > output
Run Code Online (Sandbox Code Playgroud)

会做正确的空间填充和截断。

根据awk实现,这将是字节或字符的长度(多字节字符有所不同)。在任何情况下,都不是基于这些字符的显示宽度(例如双宽或 0 宽字符,或在终端上没有显示宽度为 1 的 TAB)。

例子:

$ echo 'A|B|C|D' | awk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  C   D
Run Code Online (Sandbox Code Playgroud)

(所有这些 A B C D字素都由一个字符组成,每个字素在任何语言环境中都由一个字节组成,并且每个都是单宽度的)。

$ echo 'A|B|Ç|D' | gawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  Ç   D
$ echo 'A|B|Ç|D' | mawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  Ç  D
Run Code Online (Sandbox Code Playgroud)

ÇUTF-8 中的2 个字节,1 个宽度的字符)

$ echo $'A|B|C\u0327|D' | gawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  Ç  D
$ echo $'A|B|C\u0327|D' | mawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  Ç D
Run Code Online (Sandbox Code Playgroud)

1-byte, 1-widthC结合0-width, 2 bytes (in UTF-8) 结合cedilla形成1-width, 2-characters, 3-bytes字素Ç,分解版的预组合U+00C7Ç上例中的字符。

要考虑字符的显示宽度,使用某些expand实现(尽管不是 GNU expand)并假设输入不包含 TAB 字符并且没​​有输入字段超过其分配的宽度,您可以这样做:

<input sed $'s/|/|\t/g;s/$/|\t/' | expand -t3,8,14,22 | sed 's/| //g' >output
Run Code Online (Sandbox Code Playgroud)

在输出上printf '%s\n' 'A|B|C|D' $'A|B|\uc7|D' $'A|B|C\u327|D'应该给出:

AB  C   D
AB  Ç   D
AB  Ç   D
Run Code Online (Sandbox Code Playgroud)