有一个文件nowcoder.txt,里面的每一行都是一个数字串,编写一个shell脚本对文件中每一行的数字串进行格式化:每3个数字加入一个逗号(,)。
例如:数字串为“123456789”,那么需要格式化为123,456,789。
假设nowcoder.txt内容如下:
1121231234123456
那么你的脚本输出如下:
1121231,234123,456
1121231234123456
1121231,234123,456
1
1
1 12 123 1234 123456
1 12 123 1,234 123,456
awk -F "" '{
len = length($0)
cc = 3-len%3
for(i=1;i<=len;i++)
{
printf("%s",$i);
if ((i + cc)/3 && (i + cc)%3 == 0)
{
printf(",");
}
}
printf("\n");
}' nowcoder.txt | sed 's/,$//g' #!/bin/bash
List=()
while read line; do
if [ "${#line}" -lt "3" ]; then
echo "$line"
else
length=$(echo "scale=0; (${#line}-3)/3 + ((${#line}-3)%3 > 0) + ${#line}" | bc)
for i in $(seq $(expr ${#line} - 1) -1 0); do
if [[ $(((${#line} - $i + 5) % 3)) -eq 0 ]] && [[ ! $(expr $i + 1) = ${#line} ]]; then
List[length--]=","
fi
List[length--]=${line:i:1}
done
echo ${List[@]} | tr -d " "
fi
done # 方法1: 使用awk,
# 思路很简单,逐行遍历,然后倒序追加,最后就打印
awk -F "" 'BEGIN{}{
str="";
for(i=NF;i>=1;i--){
if(i!=NF&&(NF-i)%3==0) {
str=$i "," str
} else {
str=$i str
}
}
print str
}END{}' nowcoder.txt
# 写代码的时候发现,其实不用倒序, 脑袋秀逗了~
#1
#12
#123
#1,234 # 第2次循环的时候,应该是2,后面追加',2'
#123,456
# 可以归纳为:当(NF-i)%3==0时, 只需要追加一个逗号即可
# 优化后的代码是
awk -F "" 'BEGIN{}{
str="";
for(i=1;i<=NF;i++){
str=str $i
if((NF-i)%3==0&&i!=NF) {
str=str ","
}
}
print str
}END{}' nowcoder.txt
# 方法3:使用printf, 其中%号表示占位符的开始,整型是%d, 只需要在%和d之间加个单引号即可;
# 扩展, %d默认为右对齐,%-d表示左对齐
# shellcheck disable=SC2013
for i in $(cat nowcoder.txt);do
printf "%'-d\n" "$i"
done awk -v FS="" '{
if(length($0) <= 3){
print $0
}
else{
res=""
for(i=1;i<=NF;++i){
if(i > 1 && (NF-i+1) >= 3 && (NF-i+1)%3 == 0){
res=res","
}
res=res""$i
}
print res
}
}' nowcoder.txt