Unix在百分之一的地方添加一个逗号,在最后一个字段添加一个$

时间:2015-10-29 19:24:16

标签: unix sed

我的文本文件的最后一个字段中有一个数字,我需要在每行添加一个美元符号,在数字的百分位数添加一个逗号。所以10000现在是10,000美元。

其中一行看起来像这样

World fair:399-454-9999:832 ponce Drive, Gary, IN 87878:3/22/62:24500

需要它看起来像这样

World fair:399-454-9999:832 ponce Drive, Gary, IN 87878:3/22/62:$24,500

3 个答案:

答案 0 :(得分:2)

您可以使用' printf格式标记来获取数千个分组。

(我无法找到它的好参考,但它至少在printf man page。)

  

SUSv2指定另一个标志字符。

     

'

     

对于十进制转换( i d u f F g G )输出将与数千个'如果区域设置信息指示任何字符,则将字符分组。请注意,许多版本的gcc(1)无法解析此选项并将发出警告。 SUSv2不包括%&f; F.

然后你只需要一个相当简单的awk应用程序。

awk -F : -v OFS=: '{$NF="$"sprintf("%\047d", $NF)}7' file
  • -F :将字段分隔符设置为:,因此我们只获取最终字段中的数字
  • -v OFS=:将输出字段分隔符设置为:,以便awk为我们返回冒号
  • \047是单引号的八进制代码,可以轻松地将其嵌入单引号字符串中
  • 7是导致awk打印行的真值y值

答案 1 :(得分:1)

Perl Cookbook提供了这个正则表达式解决方案:

boolean y = 2 < 3 && 5 > func();

这可以纳入特定的解决方案:

false

输出:

else

使用解压缩的解决方案:

sub commify { my $text = reverse $_[0]; $text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g; return scalar reverse $text; }

如果安装了Number :: Format库,则有一个较短的解决方案:

perl -lpe 'BEGIN{sub commify {$t=reverse shift; $t=~s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g; reverse $t}} s/(\d+)$/chr(044).commify($1)/e' file

以上所有解决方案都使用Perl的World fair:399-454-9999:832 ponce Drive, Gary, IN 87878:3/22/62:$24,500 替换运算符和perl -lpe 'BEGIN{sub commify {$b=reverse shift; @c=unpack("(A3)*", $b); reverse join ",", @c}} s/(\d+)$/chr(044).commify($1)/e' file标记,其中eval是perl -lpe 'BEGIN{use Number::Format "format_number"} s/(\d+)$/chr(044).format_number($1)/e' file部分。
s/foo/bar/e用于打印e(否则会是eval&#39; d)

答案 2 :(得分:0)

您可以单独添加美元符号和逗号:

sed -i "s/:\([0-9]*\)$/:\$\1/g" file.txt
sed -i "s/\([0-9]\)\([0-9]\{3\}\)$/\1,\2/g" file.txt
sed -i "s/\([0-9]\)\([0-9]\{3\}\)\([0-9]\{3\}\)$/\1,\2,\3/" zeros.txt