我的文本文件的最后一个字段中有一个数字,我需要在每行添加一个美元符号,在数字的百分位数添加一个逗号。所以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
答案 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