Bash Printf格式错误
问题描述:
我的bash脚本我打印变量并使用printf 格式化输出,而大多数列是对齐的,有一些不是(注:运动媒体)。下面是打印数据的代码:Bash Printf格式错误
for((counter = 0; counter < ${#views[@]}; counter++))
{
printf "%-40s | %-9s | %-15s" "${users[$counter]}" "${views[$counter]}" "${duration[$counter]}" #"${ids[$counter]}" "${titles[$counter]}"
printf "\n"
}
下面是输出的一个样本:
users | views | duration
Saturday Night Live | 10853524 | 9:46
Right Side Broadcasting | 346333 | 2:34:31
FOX 10 Phoenix | 319507 | 3:29
LastWeekTonight | 2997140 | 19:55
nigahiga | 6372021 | 2:56
Disney Movie Trailers | 7372656 | 1:50
RWW Blog | 125448 | 1:29
POLITICAL HUMOR | 173517 | 4:23
solangeknowlesmusic | 1613158 | 4:25
theDOMINICshow | 488995 | 4:13
TheWeekndVEVO | 1937027 | 3:59
swampgarage | 720718 | 1:43
Fox News | 164336 | 7:40
Bud Light | 224627 | 0:16
BuzzFeedVideo | 5575303 | 7:56
swampfoot | 8177252 | 9:07
Bloomberg | 349937 | 2:33
Kubau2 | 6358091 | 8:40
DOCUMENTARY TUBE | 926035 | 13:12
KLM Royal Dutch Airlines | 5796674 | 6:12
DOCUMENTARY TUBE | 3456648 | 10:51
ExtremeTV | 18846489 | 6:34
Sport Mídia | 4806074 | 8:23
Sam Chui | 6124697 | 6:47
DMKSPROD | 4111882 | 11:30
答
这就是为什么制表符的发明:具有在相同位置的文字。
$ a="ExtremeTV"
$ b="Sport Mídia"
$ printf '%18s |\n' "$a" "$b"
ExtremeTV |
Sport Mídia |
$ printf '%18s \t|\n' "$a" "$b"
ExtremeTV |
Sport Mídia |
“Mídia”的第二个字符看起来像非ascii。我的猜测是你的输入是用多字节编码的,而且printf认为“í”是两个字符,但是只打印一个字符。 – JesperE
通过适当的语言环境设置,这个应用程序与最近合理的Bash IIRC一起工作。 locale -a的输出是什么,你的Bash版本是什么? – tripleee