2012-07-05 34 views
0

在bash我可以使用printf格式化像这样的字符串输出: - (请注意我是如何加的W后缀的字符串,这是不包括在填充)猛砸printf的前缀

$ printf "Blah %11.1fW\n" 123 456 78965 5 56 
Blah  123.0W 
Blah  456.0W 
Blah  78965.0W 
Blah   5.0W 
Blah  56.0W 

如果我想前缀字符串我可以这样做: -

$ printf "Blah £%11.1f\n" 123 456 78965 5 56 
Blah £  123.0 
Blah £  456.0 
Blah £ 78965.0 
Blah £  5.0 
Blah £  56.0 

但是请注意这是如何导致填充前缀之前被应用。

如何(如果可能的话)我会用printf填充之前的前缀值,使输出将如下所示: -

Blah  £ 123.0 
Blah  £ 456.0 
Blah £ 78965.0 
Blah  £ 5.0 
Blah  £ 56.0 

如果没有任何可能的解决方案的Bash将是适当的。

+0

会计师对此感到满意吗?根据我的经验,'printf'风格四舍五入导致会计师晕倒。 – cdarke 2012-07-05 10:47:30

+0

@cdarke大声笑。这只是一个例子。没有会计师参与! – 2012-07-05 10:51:29

回答

4

我想出了这一点:

$ printf "Rate: %11s\n" $(printf "$%.1f " 12345 123) 
Rate: $12345.0 
Rate:  $123.0 

只是要确保选择适合您的情况下正确的%11s


看来你自己解决了这个空间问题。为了完整起见,我会把它放在这里。

$ printf "Rate: %11s\n" $(printf "$%.1f " 12345 123) | sed 's/\$/\$ /g' 
Rate: $ 12345.0 
Rate:  $ 123.0 

这是一个被@FatalError给出了解决方案:

printf "Rate: %11b\n" $(printf '$\\0040%.1f ' 12345 123) 
Rate: $ 12345.0 
Rate:  $ 123.0 
+0

啊哈是的,这个问题是当你引入货币符号和数据之间的空间时。 – 2012-07-05 10:42:47

+0

将管道输出转换为'sed's/\£/ \£/ g''可能会帮助我。 – 2012-07-05 10:45:26

+1

如果没有'sed',你可以:'printf'评价:%11b \ n“$(printf'$ \\ 0040%.1f'12345 123)' – FatalError 2012-07-05 11:42:29

3

不可能的。你需要像strfmon这样的东西。解决方法:

$ a=(123 456 78965 5 56) 
$ printf 'blah %*s %.1f\n' {,,,,}{$((10 - ${#a[n]})),£,"${a[n++]}"} 
blah  £ 123.0 
blah  £ 456.0 
blah £ 78965.0 
blah  £ 5.0 
blah  £ 56.0 
+0

这是...美丽。 :-) – Graham 2012-07-10 12:04:01

2

虽然我爱ormaaj的保持东西,在外壳的解决方案,我不喜欢使用子shell,除非我真的需要它们。而且,一个既有子外壳也有管道的线似乎是不必要的。

$ printf "Rate: %11.1f\n" 123 | sed 's/ \([0-9]\)/$ \1/' 
Rate:  $ 123.0