免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4479 | 回复: 3
打印 上一主题 下一主题

[文本处理] Shell计算素数脚本 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-25 05:17 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2014-01-24 22:26 编辑

我在shell下写了两个脚本来计算素数,其中一个算出素数,另外一个将输出变为我希望的格式:
脚本一:计算素数:
  1. #!/bin/bash
  2. # prime.sh
  3. file="prime.txt"
  4. prime1=2
  5. prime2=3
  6. echo $prime1 >> $file
  7. echo $prime2 >> $file
  8. while [ $prime2 -gt 0 ] ; do
  9. let prime2=$prime2+2
  10. cat $file|while read -r oldprime ; do
  11. if [ $(($oldprime*oldprime-prime2)) -gt 0 ] ; then
  12. echo $prime2 >> $file
  13. break
  14. fi
  15. if [ $(($prime2%oldprime)) -eq 0 ]; then
  16. break
  17. fi
  18. done
  19. done
复制代码
脚本二:将保存在prime.txt文件中的素数,以每行显示10个素数,在每行的行末标记素数的个数。
每逢第100个,素数计数以绿色显示,每逢第1000个,素数计数以红色显示,每逢第10000个,素数计数以黄色显示。
  1. #!/bin/bash
  2. # 1to10.sh
  3. infile="prime.txt"
  4. prime=0

  5. tail -f $infile|while read -r i
  6. do
  7. let prime=$prime+1
  8.         if [ $(($prime%10)) -eq 0 ]
  9.         then
  10.                 if [ $(($prime%10000)) -eq 0 ]
  11.                 then
  12.                 printf "\033[1;33;40m$i - [ $prime ]\033[m\n"
  13.                 else
  14.                         if [ $(($prime%1000)) -eq 0 ]
  15.                         then
  16.                         printf "\033[1;31;40m$i - [ $prime ]\033[m\n"
  17.                         else
  18.                                 if [ $(($prime%100)) -eq 0 ]
  19.                                 then
  20.                                 printf "\033[1;32;40m$i - [ $prime ]\033[m\n"
  21.                                 else
  22.                                 printf "$i - [ $prime ]\n"
  23.                                 fi
  24.                         fi
  25.                 fi
  26.         else
  27.         printf "$i "
  28.         fi
  29. done
复制代码
然后用以下脚本或者手工输入命令启动这两个脚本:
  1. #!/bin/bash
  2. :>prime.txt
  3. ./1to10.sh > prime10.txt &
  4. ./prime.sh &
复制代码
输出的效果如下:
  1. [root@jinx prime]# more prime10.txt
  2. 2 3 5 7 11 13 17 19 23 29 - [ 10 ]
  3. 31 37 41 43 47 53 59 61 67 71 - [ 20 ]
  4. 73 79 83 89 97 101 103 107 109 113 - [ 30 ]
  5. 127 131 137 139 149 151 157 163 167 173 - [ 40 ]
  6. 179 181 191 193 197 199 211 223 227 229 - [ 50 ]
  7. 233 239 241 251 257 263 269 271 277 281 - [ 60 ]
  8. 283 293 307 311 313 317 331 337 347 349 - [ 70 ]
  9. 353 359 367 373 379 383 389 397 401 409 - [ 80 ]
  10. 419 421 431 433 439 443 449 457 461 463 - [ 90 ]
  11. 467 479 487 491 499 503 509 521 523 541 - [ 100 ]
  12. 547 557 563 569 571 577 587 593 599 601 - [ 110 ]
  13. 607 613 617 619 631 641 643 647 653 659 - [ 120 ]
  14. 661 673 677 683 691 701 709 719 727 733 - [ 130 ]
  15. 739 743 751 757 761 769 773 787 797 809 - [ 140 ]
  16. 811 821 823 827 829 839 853 857 859 863 - [ 150 ]
  17. 877 881 883 887 907 911 919 929 937 941 - [ 160 ]
  18. 947 953 967 971 977 983 991 997 1009 1013 - [ 170 ]
  19. 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069 - [ 180 ]
  20. 1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 - [ 190 ]
  21. 1153 1163 1171 1181 1187 1193 1201 1213 1217 1223 - [ 200 ]
  22. 1229 1231 1237 1249 1259 1277 1279 1283 1289 1291 - [ 210 ]
  23. 1297 1301 1303 1307 1319 1321 1327 1361 1367 1373 - [ 220 ]
  24. 1381 1399 1409 1423 1427 1429 1433 1439 1447 1451 - [ 230 ]
  25. 1453 1459 1471 1481 1483 1487 1489 1493 1499 1511 - [ 240 ]
  26. 1523 1531 1543 1549 1553 1559 1567 1571 1579 1583 - [ 250 ]
  27. 1597 1601 1607 1609 1613 1619 1621 1627 1637 1657 - [ 260 ]
  28. 1663 1667 1669 1693 1697 1699 1709 1721 1723 1733 - [ 270 ]
  29. 1741 1747 1753 1759 1777 1783 1787 1789 1801 1811 - [ 280 ]
  30. 1823 1831 1847 1861 1867 1871 1873 1877 1879 1889 - [ 290 ]
  31. 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987 - [ 300 ]
  32. 1993 1997 1999 2003 2011 2017 2027 2029 2039 2053 - [ 310 ]
  33. 2063 2069 2081 2083 2087 2089 2099 2111 2113 2129 - [ 320 ]
  34. 2131 2137 2141 2143 2153 2161 2179 2203 2207 2213 - [ 330 ]
  35. 2221 2237 2239 2243 2251 2267 2269 2273 2281 2287 - [ 340 ]
  36. 2293 2297 2309 2311 2333 2339 2341 2347 2351 2357 - [ 350 ]
  37. 2371 2377 2381 2383 2389 2393 2399 2411 2417 2423 - [ 360 ]
  38. 2437 2441 2447 2459 2467 2473 2477 2503 2521 2531 - [ 370 ]
  39. 2539 2543 2549 2551 2557 2579 2591 2593 2609 2617 - [ 380 ]
  40. 2621 2633 2647 2657 2659 2663 2671 2677 2683 2687 - [ 390 ]
  41. 2689 2693 2699 2707 2711 2713 2719 2729 2731 2741 - [ 400 ]
  42. 2749 2753 2767 2777 2789 2791 2797 2801 2803 2819 - [ 410 ]
  43. 2833 2837 2843 2851 2857 2861 2879 2887 2897 2903 - [ 420 ]
  44. 2909 2917 2927 2939 2953 2957 2963 2969 2971 2999 - [ 430 ]
  45. 3001 3011 3019 3023 3037 3041 3049 3061 3067 3079 - [ 440 ]
  46. 3083 3089 3109 3119 3121 3137 3163 3167 3169 3181 - [ 450 ]
  47. 3187 3191 3203 3209 3217 3221 3229 3251 3253 3257 - [ 460 ]
  48. 3259 3271 3299 3301 3307 3313 3319 3323 3329 3331 - [ 470 ]
  49. 3343 3347 3359 3361 3371 3373 3389 3391 3407 3413 - [ 480 ]
  50. 3433 3449 3457 3461 3463 3467 3469 3491 3499 3511 - [ 490 ]
  51. 3517 3527 3529 3533 3539 3541 3547 3557 3559 3571 - [ 500 ]
  52. 3581 3583 3593 3607 3613 3617 3623 3631 3637 3643 - [ 510 ]
  53. 3659 3671 3673 3677 3691 3697 3701 3709 3719 3727 - [ 520 ]
  54. 3733 3739 3761 3767 3769 3779 3793 3797 3803 3821 - [ 530 ]
  55. 3823 3833 3847 3851 3853 3863 3877 3881 3889 3907 - [ 540 ]
  56. 3911 3917 3919 3923 3929 3931 3943 3947 3967 3989 - [ 550 ]
  57. 4001 4003 4007 4013 4019 4021 4027 4049 4051 4057 - [ 560 ]
  58. 4073 4079 4091 4093 4099 4111 4127 4129 4133 4139 - [ 570 ]
  59. 4153 4157 4159 4177 4201 4211 4217 4219 4229 4231 - [ 580 ]
  60. 4241 4243 4253 4259 4261 4271 4273 4283 4289 4297 - [ 590 ]
  61. 4327 4337 4339 4349 4357 4363 4373 4391 4397 4409 - [ 600 ]
  62. 4421 4423 4441 4447 4451 4457 4463 4481 4483 4493 - [ 610 ]
  63. 4507 4513 4517 4519 4523 4547 4549 4561 4567 4583 - [ 620 ]
  64. 4591 4597 4603 4621 4637 4639 4643 4649 4651 4657 - [ 630 ]
  65. 4663 4673 4679 4691 4703 4721 4723 4729 4733 4751 - [ 640 ]
  66. 4759 4783 4787 4789 4793 4799 4801 4813 4817 4831 - [ 650 ]
  67. 4861 4871 4877 4889 4903 4909 4919 4931 4933 4937 - [ 660 ]
  68. 4943 4951 4957 4967 4969 4973 4987 4993 4999 5003 - [ 670 ]
  69. 5009 5011 5021 5023 5039 5051 5059 5077 5081 5087 - [ 680 ]
  70. 5099 5101 5107 5113 5119 5147 5153 5167 5171 5179 - [ 690 ]
  71. 5189 5197 5209 5227 5231 5233 5237 5261 5273 5279 - [ 700 ]
  72. 5281 5297 5303 5309 5323 5333 5347 5351 5381 5387 - [ 710 ]
  73. 5393 5399 5407 5413 5417 5419 5431 5437 5441 5443 - [ 720 ]
  74. 5449 5471 5477 5479 5483 5501 5503 5507 5519 5521 - [ 730 ]
  75. 5527 5531 5557 5563 5569 5573 5581 5591 5623 5639 - [ 740 ]
  76. 5641 5647 5651 5653 5657 5659 5669 5683 5689 5693 - [ 750 ]
  77. 5701 5711 5717 5737 5741 5743 5749 5779 5783 5791 - [ 760 ]
  78. 5801 5807 5813 5821 5827 5839 5843 5849 5851 5857 - [ 770 ]
  79. 5861 5867 5869 5879 5881 5897 5903 5923 5927 5939 - [ 780 ]
  80. 5953 5981 5987 6007 6011 6029 6037 6043 6047 6053 - [ 790 ]
  81. 6067 6073 6079 6089 6091 6101 6113 6121 6131 6133 - [ 800 ]
  82. 6143 6151 6163 6173 6197 6199 6203 6211 6217 6221 - [ 810 ]
  83. 6229 6247 6257 6263 6269 6271 6277 6287 6299 6301 - [ 820 ]
  84. 6311 6317 6323 6329 6337 6343 6353 6359 6361 6367 - [ 830 ]
  85. 6373 6379 6389 6397 6421 6427 6449 6451 6469 6473 - [ 840 ]
  86. 6481 6491 6521 6529 6547 6551 6553 6563 6569 6571 - [ 850 ]
  87. 6577 6581 6599 6607 6619 6637 6653 6659 6661 6673 - [ 860 ]
  88. 6679 6689 6691 6701 6703 6709 6719 6733 6737 6761 - [ 870 ]
  89. 6763 6779 6781 6791 6793 6803 6823 6827 6829 6833 - [ 880 ]
  90. 6841 6857 6863 6869 6871 6883 6899 6907 6911 6917 - [ 890 ]
  91. 6947 6949 6959 6961 6967 6971 6977 6983 6991 6997 - [ 900 ]
  92. 7001 7013 7019 7027 7039 7043 7057 7069 7079 7103 - [ 910 ]
  93. 7109 7121 7127 7129 7151 7159 7177 7187 7193 7207 - [ 920 ]
  94. 7211 7213 7219 7229 7237 7243 7247 7253 7283 7297 - [ 930 ]
  95. 7307 7309 7321 7331 7333 7349 7351 7369 7393 7411 - [ 940 ]
  96. 7417 7433 7451 7457 7459 7477 7481 7487 7489 7499 - [ 950 ]
  97. 7507 7517 7523 7529 7537 7541 7547 7549 7559 7561 - [ 960 ]
  98. 7573 7577 7583 7589 7591 7603 7607 7621 7639 7643 - [ 970 ]
  99. 7649 7669 7673 7681 7687 7691 7699 7703 7717 7723 - [ 980 ]
  100. 7727 7741 7753 7757 7759 7789 7793 7817 7823 7829 - [ 990 ]
  101. 7841 7853 7867 7873 7877 7879 7883 7901 7907 7919 - [ 1000 ]
  102. 7927 7933 7937 7949 7951 7963 7993 8009 8011 8017 - [ 1010 ]
  103. 8039 8053 8059 8069 8081 8087 8089 8093 8101 8111 - [ 1020 ]
  104. 8117 8123 8147 8161 8167 8171 8179 8191 8209 8219 - [ 1030 ]
  105. 8221 8231 8233 8237 8243 8263 8269 8273 8287 8291 - [ 1040 ]
  106. 8293 8297 8311 8317 8329 8353 8363 8369 8377 8387 - [ 1050 ]
  107. 8389 8419 8423 8429 8431 8443 8447 8461 8467 8501 - [ 1060 ]
  108. 8513 8521 8527 8537 8539 8543 8563 8573 8581 8597 - [ 1070 ]
  109. 8599 8609 8623 8627 8629 8641 8647 8663 8669 8677 - [ 1080 ]
  110. 8681 8689 8693 8699 8707 8713 8719 8731 8737 8741 - [ 1090 ]
  111. 8747 8753 8761 8779 8783 8803 8807 8819 8821 8831 - [ 1100 ]
  112. 8837 8839 8849 8861 8863 8867 8887 8893 8923 8929 - [ 1110 ]
  113. 8933 8941 8951 8963 8969 8971 8999 9001 9007 9011 - [ 1120 ]
  114. 9013 9029 9041 9043 9049 9059 9067 9091 9103 9109 - [ 1130 ]
  115. 9127 9133 9137 9151 9157 9161 9173 9181 9187 9199 - [ 1140 ]
  116. 9203 9209 9221 9227 9239 9241 9257 9277 9281 9283 - [ 1150 ]
  117. 9293 9311 9319 9323 9337 9341 9343 9349 9371 9377 - [ 1160 ]
  118. 9391 9397 9403 9413 9419 9421 9431 9433 9437 9439 - [ 1170 ]
  119. 9461 9463 9467 9473 9479 9491 9497 9511 9521 9533 - [ 1180 ]
  120. 9539 9547 9551 9587 9601 9613 9619 9623 9629 9631 - [ 1190 ]
  121. 9643 9649 9661 9677 9679 9689 9697 9719 9721 9733 - [ 1200 ]
  122. 9739 9743 9749 9767 9769 9781 9787 9791 9803 9811 - [ 1210 ]
  123. 9817 9829 9833 9839 9851 9857 9859 9871 9883 9887 - [ 1220 ]
  124. 9901 9907 9923 9929 9931 9941 9949 9967 9973
复制代码
我想知道如果用更强大的文本处理工具awk,有没有更简练的办法,只用一个脚本实现这样的输出。
注意不是只输出从1到某个数之间的素数,而是一直到无限的,只要不停止程序就一直输出下去。

论坛徽章:
0
2 [报告]
发表于 2014-01-25 23:34 |只看该作者
shell用函数不就可以只用一个脚本文件了...
下面是简单写的,大意如此... awk肯定是可以的。
另外楼主把素数全存文件里,对磁盘的读写也很多吧,可能也会影响速度。

  1. #!/bin/bash

  2. function getfact()
  3. {
  4.   for i in `seq 2 $1`
  5.   do
  6.     if [[ $(($1 % $i)) -eq 0 ]]
  7.     then
  8.       echo $i
  9.       return 0
  10.     fi
  11.   done
  12. }

  13. function output()
  14. {
  15.   if [ $n -eq 10 ]
  16.   then
  17.     echo $1
  18.     n=1
  19.   else
  20.     /bin/echo -n $1," "
  21.     ((n++))
  22.   fi
  23. }

  24. n=1
  25. start=2

  26. while [ true ]
  27. do
  28.   if [ `getfact $start` -eq $start ]
  29.   then
  30.     output $start
  31.   fi
  32.   ((start++))
  33. done
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
3 [报告]
发表于 2014-01-26 10:43 |只看该作者
着色的条件做不到:
  1. awk 'BEGIN{i=2;while(1){for(j=1;++j<i;)if(!(i%j))k=1;if(!k){printf "%s ",i;n++;if(!(n%10))printf "- [ %s ]\n",n}k=0;i++}}'
  2. 2 3 5 7 11 13 17 19 23 29 - [ 10 ]
  3. 31 37 41 43 47 53 59 61 67 71 - [ 20 ]
  4. 73 79 83 89 97 101 103 107 109 113 - [ 30 ]
  5. 127 131 137 139 149 151 157 163 167 173 - [ 40 ]
  6. 179 181 191 193 197 199 211 223 227 229 - [ 50 ]
  7. 233 239 241 251 257 263 269 271 277 281 - [ 60 ]
  8. 283 293 307 311 313 317 331 337 347 349 - [ 70 ]
  9. 353 359 367 373 379 383 389 397 401 409 - [ 80 ]
  10. 419 421 431 433 439 443 449 457 461 463 - [ 90 ]
  11. 467 479 487 491 499 503 509 521 523 541 - [ 100 ]
  12. ……
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
4 [报告]
发表于 2014-01-26 13:10 |只看该作者
有一个现成的算素数的命令:factor。着色嘛倒是没有。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP