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中实现这一点?请协助
与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)