Shell 格式化输出
Shell 格式化输出
题目
我们有一个文件nowcoder.txt,里面的每一行都是一个数字串,假设数字串为“123456789”,那么我们要输出为123,456,789。
假设nowcoder.txt内容如下
1
12
123
1234
123456
那么你的脚本输出如下
1
12
123
1,234
123,456
题解
根据分析题目,可以得到流程应该是
1.先读入一行
2.当行的数字满足条件就添加逗号
格式化输出第一个想到的指令是printf 和 awk
解法1-printf格式修饰符
格式化打印printf指令里,通过格式修饰符%'d,内置了将千位分组分隔符应用于输出的整数部分。
# 错误写法 好像时引号的问题
cat nowcoder.txt | awk '{printf "%\'d" $0}'
然后我灵机一动,文件全部输出成一行,利用xargs连接printf非管道符,每次取一个参数利用格式修饰符输出
cat nowcoder.txt | xargs -n1  printf "%'d\n"
#也可以写成
#!/bin/bash
for i in `cat nowcoder.txt` # 获得一行
do
  printf "%'d\n" $i
done
解法2-awk
如果不适用printf的特性要怎么做?
获取一行之后,我们需要知道每一行数字的长度,小于等于3就不需要处理了。
如何统计数字长度?
可以使用wc这里会比较麻烦
awk里的NF表示字段的个数,如果我们一个数字是一个字段就行了。
awk -F ''  一个字符是以一个字段
如果NF<=3 直接一行输出
如果NF>3 需要进行处理
如何处理?从后往前拼接数字
str = "" ; # 用于拼接
for(i=1;i<=NF;i++){
	j = NF + 1 - i ; # 逆序之后的下标,假设1234,那么i=1变成了j=4,这里我们就可以实现从后往前输出了
	number = $j number #从后往前输出
	if(i%3==0 && i!=NF) number = "," number  #i用于计数,从后往前输出三个后,前面还有数就在前面添加逗号
}
    print number
}'
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号