首页 > 试题广场 >

格式化输出

[编程题]格式化输出
  • 热度指数: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
sed -E ':a; s/([[:digit:]])([[:digit:]]{3})\>/\1,\2/; ta'
\>是匹配一个零宽的单词边界
发表于 2021-11-20 13:23:57 回复(4)
for i in `cat nowcoder.txt`
do
  printf "%'d\n" $i
done

发表于 2021-12-02 14:22:38 回复(5)
#!/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)
#!/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)
cat nowcoder.txt | xargs -n1  printf "%'d\n"
发表于 2021-12-12 17:07:37 回复(3)
#!/bin/bash

cat nowcoder.txt | xargs printf "%'d\n"

发表于 2024-09-26 17:56:49 回复(0)
     gawk '{
    5       res = ""
    6       len = length($0)
    7       if( len <=3 ) # 长度小于等于3位,直接截取赋值
    8           res = substr($0, 1, len)
    9       else { # 长度大于3位
   10
   11          step_one = length($0) % 3 # 判断长度是否是3的倍数
   12          if( step_one != 0 ) { # 串的长度不是3的倍数,第一次截取前面的几位
   13             res = substr( $0, 1, step_one )","
   14             for( i=step_one+1; i<=len; i=i+3 ) {
   15
   16               if( (i+2) == len ) # 判断是否到达串的末尾,末尾不加逗号
   17                   res = res substr( $0,  i, 3 )
   18                else # 中间部分需要每隔3位添加一个逗号
   19                   res = res substr($0, i, 3)","
   20           }
   21        }
   22        else { # 串的长度是3的整数倍,不需要特殊截取
   23          for( i=1; i<=len; i=i+3 ) {
   24            if(  (i+2) == len )
   25                res = res substr( $0, i, 3)
   26           else
   27               res = res substr($0, i, 3)","
   28          }
   29        }
   30     }
   31     print res
   32   }' "$1"
发表于 2024-09-03 14:21:47 回复(0)
awk '
BEGIN {
    FS = ""
}
{
    i = 1
    s = ""
    for(j = NF; j >= 1; j--)
    {
        s = $j s;
        if(i%3 == 0 && i != NF){
            s = "," s ;
        }
        i ++;
    }
    print s
}
'
发表于 2024-06-20 21:08:47 回复(0)
awk '{ printf "%\'"'"'d\n", $1 }' nowcoder.txt
发表于 2024-05-24 14:16:13 回复(0)
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 'BEGIN{FS=""}{
    k=0;
    j=1;
    for(i=NF;i>=1;i--){
        if(k<2){
            row[j]=$i;k++;
        }else{
            row[j]=","$i;
            k=0;
        }
        j++;
    }
    for(i=j-1;i>=1;i--){
        printf  row[i]
    }
    printf "\n"
}' | sed "s/^,//g"

发表于 2023-10-15 15:18:32 回复(0)
awk '{
    line=$0;len=length(line);
    side=len%3;loop=(len-side)/3
    if(side > 0){
        printf substr(line, 0,side)
        if(loop > 0) printf ","
    }
   
    for(i=0;i<loop;i++){
        printf substr(line, side+i*3+1,3)
        if(i+1 < loop) printf ","
    }
    printf "\n"

}'
发表于 2023-09-22 17:11:19 回复(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)
#!/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

发表于 2023-04-07 15:56:57 回复(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)
cat nowcoder.txt | sed '{:start;  s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/ ;t start}' 
发表于 2022-12-18 02:47:37 回复(0)
sed -E ':eof; s/([0-9])([0-9]{3})\>/\1,\2/; teof'

发表于 2022-09-19 14:26:29 回复(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)