首页 > 试题广场 >

格式化输出

[编程题]格式化输出
  • 热度指数:12521 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
有一个文件nowcoder.txt,里面的每一行都是一个数字串,编写一个shell脚本对文件中每一行的数字串进行格式化:每3个数字加入一个逗号(,)。
例如:数字串为“123456789”,那么需要格式化为123,456,789。

假设nowcoder.txt内容如下:
1
12
123
1234
123456
那么你的脚本输出如下:
1
12
123
1,234
123,456

输入描述:
1


输出描述:
1
示例1

输入

1
12
123
1234
123456

输出

1
12
123
1,234
123,456
awk -F "" '{
    for (i=1;i<=NF;i++)
    {
        if((NF-i)%3==0 && i!=NF)
        {
            $i=$i","
        }
    }
    print $0
}' | tr -d ' '
发表于 2024-04-30 16:30:31 回复(0)
#!/bin/bash

awk -F "" '{
row=""
for(i=1;i<=NF;i++) {
row=$(NF-i+1)row
if( i%3==0 && i != NF ){
row=","row
}
}
print row
}'
发表于 2023-05-28 18:17:10 回复(0)
# 方法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

发表于 2023-03-21 21:16:04 回复(0)

awk基本循环+条件判断+FS

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
发表于 2022-08-27 21:37:38 回复(0)
awk -F "" '{ret="";for(i=1;i<=NF;i++){ret=ret $i;if(i%3==NF%3 && i!=NF)ret=ret ","} print ret}'
发表于 2022-08-23 21:39:06 回复(0)
#!/bin/bash
while read line
do 
    printf "%'d\n" ${line}; 
done < nowcoder.txt
发表于 2022-08-04 16:25:18 回复(0)
规规矩矩的awk + C
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'


发表于 2022-07-31 08:50:43 回复(0)
awk -F "" '{
str=""
for(i=NF;i>0;i--){
str=sprintf("%s%s",$i,str)
if((NF-i+1)%3==0 && i!=1){
str=sprintf(",%s",str)
}
}
print(str)
}'
发表于 2022-07-17 02:03:00 回复(0)
while read line
do
    if [ $line -lt 1000 ];then
        echo $line 
        continue
    fi
    while [ $((line / 1000)) -ge 1 ]
    do
      s=$(( line % 1000 ))
      line=$(( ((line-s))/1000 ))
    if [ ${str} ];then
        str=$s,${str}
    else
        str=$s
    fi
    done
    echo $line,${str}
    unset str
done< nowcoder.txt
发表于 2022-07-06 17:19:21 回复(0)
#!/bin/bash
while read line
do
        k=0
        lin_len=${#line}
        str=""
        for(( i=$lin_len-1;i>=0;i--))
        do
                k=$[ $k + 1 ]
                str="${line:$i:1}$str"
                if [ $[ $k % 3 ] -eq 0 ] && [ $i -gt 0 ] && [ $lin_len -gt 3 ]
                then
                        str=",$str"
                fi

        done
        echo ${str}

done
发表于 2022-05-24 15:00:20 回复(0)
while read line; do
    echo $line | sed -r 's#([0-9])#\1\n#g' | tac |
        awk '{printf($0); printf("\n"); if(NR%3==1) printf(",\n")}' |
        tac | awk '{printf($0)}' | sed -r 's#^,?(.*[^,]),?$#\1#g'
    echo ""
done < nowcoder.txt

本地可以输出,为什么在线提交没有输出?

发表于 2022-04-26 02:53:45 回复(0)
while read line; do
    len=${#line}
    mod=$(($len%3))
    str=""

    if [ $mod -ne 0 ]; then
        str="${line:0:$mod}"
    else
        str="${line:0:3}"
    fi

    mod=${#str}
    for((i=$mod;i<$len;i=$i+3)); do
        str="$str,${line:i:3}"
    done
    
    echo $str
done < nowcoder.txt

发表于 2022-04-17 23:10:12 回复(0)
#! /bin/bash
#没通过,打印的顺序不对
awk -F "" '{
row=""
for(i=1;i<=NF;i=i+1){
    if( i%3==0 && i != NF)
        row= row  $i ","
    else
        row= row $i
}
print row
}'
发表于 2022-03-22 22:48:25 回复(1)
不支持perl,差评
perl -pe 's/(?<!^)(?=(\d{3})+$)/,/g'
发表于 2022-02-28 13:55:07 回复(1)
for i in `cat nowcoder.txt`
do
  printf "%'d\n" $i
done

发表于 2021-12-02 14:22:38 回复(5)
awk -F "" '{
    number = "";
    for(i = 1; i<=NF;i++){
        j = NF + 1 - i
        number = $j number
        if(i%3==0 && i!=NF) number = "," number
    }
    print number
}' 
从后往前拼接数字
发表于 2021-11-27 00:25:52 回复(0)
纯shell
while read line
    do
        k=0
        lStr=${#line}
        for ((i=$lStr-1; i>=0; i--))
            do
                ((k++))
                str="${line:i:1}$str"
                [ $(($k%3)) -eq 0 ] && [ $i -ge 1  ] && [ $lStr -gt 3 ] && str=",$str"
            done
            echo "$str"
            str=""
    done
纯awk
awk -F "" '{
    k=0
    for (i=NF; i>0; i--) {
        k++
        str = sprintf("%s%s", $i, str)
        if (k%3 == 0 && i>=2 && NF > 3) {
            str = sprintf(",%s", str)
        }
    }
    print(str)
    str=""
}'




发表于 2021-11-25 11:44:40 回复(0)
cat nowcoder.txt | while read line   
do
        # 最终要显示的字符串 
        line_target=""  
        # 当前行的长度
        line_length=${#line} 
        # 倒序取每个字符
        for (( i=1;i<=${line_length} ;i++ )) 
        do
                bit=${line:0-${i} :1}
                line_target=${bit}${line_target} 
                # 每逢3个加一个“,”,且加的位置不能是字符串的最前面
                if [ $[ ${i} % 3 ] -eq 0  ] && [ ${i} -ne ${line_length} ]; then 
                   line_target=","${line_target}
                fi
        done
        echo ${line_target} 

done

发表于 2021-11-19 18:02:18 回复(0)