忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
楼主: bmne

[文本处理] 麻烦给去掉指定字符行 [复制链接]

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-10-31 07:28 |显示全部楼层
回复 20# rubyish

大牛

是这样
你放出的大量的代码,容我“二傻”消化消化,没有重大的问题,我先放一放它(如,非ASCII这样的问题,我必须抓紧告知并求助你)
你想想,我的求助近2年没人帮助,突然遇到你好人,我能“放过”你大牛?
C语言,效率之高,其它没有可比性
所以,必须趁你现在多少有点时间的时候,抓紧时间,先把问题提出来,否则,等你忙起来后......可能又要等上几年
请大牛理解!


问题:

总感觉现在你的  floor42C.c  不是太接近完美。主要原因是,文档数量巨大,没法分出类型,导致硬盘装不下,后续整理异常困难。


求助:

请继续修改  floor42C.c  

要求:
1、继续保留可以任意指定行的位数(如:  ./floor42C dlup 8 100 0  这样指定8位)
2、四种字符串,继续保留(用于可以选择性运行)。  d: digi, l: lower, u: upper, p: punc
3、继续保留正式运行前,先前期判断下要输出的文档的大小。(如:  ./floor42C dlup 8 100 这样形式)
4、继续保留可以任意选择可以截取文档的大小  (如:  ./floor42C dlup 8 100 0  截取100GB这样形式)

5、新增加一项:可以任意选择开头的字符的项(比如:纯数字、小写字母、大写字母加起来共62个字符可用的开头)


例如:
要求:人为指定提取出,纯数字+小写字母+大写字母混合不重复的、开头是小写字母k的、每一段文档是200GB、共8位的行

根据上面的要求,现在已有的  floor42C.c  大概可以表示成  ./floor42C dlu 8 200 0  这个意思
./floor42C dlu 8 200
SIZE  = 1142670.44 G
RANGE = 0 .. 5818
PARTX = 196.39 G

如果再加上一条,只提取人为指定开头是小写字母k的行,我不知道怎样表示了(形如 ./floor42C dlu 8 200 k 0  只是表示下,明白意思即可)


估计应该能看明白

谢谢!又要辛苦你了!(碰碰运气吧,但愿你有点时间)






论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2017-11-03 01:00 |显示全部楼层
回复 21# bmne update ~~

sieveA.c
  1. # include <stdio.h>
  2. # define LENGTH 16

  3. typedef char kar;
  4. typedef char *str;
  5. typedef unsigned Int;

  6. void sieve ();
  7. int main (){
  8.     sieve ();
  9. }
  10. /* _____________________ SUB _____________________ */

  11. # define isdigit(X) X < 58
  12. # define END '\n'
  13. # define MN  3

  14. void sieve (){
  15.     kar line[LENGTH];
  16.     int X[123] = {
  17.         ['0' ... '9'] = 4,
  18.         ['m']         = 1,
  19.         ['M']         = 1,
  20.         ['n']         = 2,
  21.         ['N']         = 2,
  22.     };

  23.     while (fgets (line, LENGTH, stdin)) {
  24.         # define dat (dit - 1)
  25.         # define var(K) X[(Int)K]
  26.         str dit = line + 1;

  27.         while (*dit > END) {
  28.             int val = var (*dit);
  29.             if (!val) {
  30.                 dit += 2;
  31.             } else if (val == 4) {
  32.                 if (isdigit (*dat)) break;
  33.                 dit++;
  34.             } else {
  35.                 if ((val | var (*dat)) == MN) break;
  36.                 dit++;
  37.             }
  38.         }
  39.         if (*dit <= END) fputs (line, stdout);
  40.     }

  41. } /* sieve */

复制代码



论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-03 07:11 |显示全部楼层
回复 22# rubyish


大牛,请按照21楼的说法,麻烦再重新修正一下  floor42C   这个很重要的,谢谢  


floor42C.c

  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <string.h>

  4. typedef char kar;
  5. typedef char *str;
  6. typedef double dub;
  7. typedef unsigned long long Int;

  8. int COLLECT;
  9. int SIZE;
  10. int LENDIT;
  11. int LENSTR;
  12. int HEAD;
  13. int *HAS;
  14. Int FINISH;
  15. Int MEKS;
  16. Int GLOB;
  17. str DAT;
  18. str DIT;
  19. str STR;

  20. void gene (int);
  21. void telle (int);
  22. void test (void);
  23. void explore (str);
  24. void help (str);
  25. void floor42 (int);
  26. void init (str *);
  27. void quit (int);
  28. /* ____________________ MAIN ____________________ */

  29. int main (int numa, str *para){
  30.     if (numa < 4 || numa > 5) help (para[0]);
  31.     init (para);
  32.     if (numa == 4) test ();
  33.     explore (para[4]);
  34. }

  35. /* _____________________ SUB _____________________ */
  36. void init (str *para){
  37.     COLLECT = atoi (para[2]);
  38.     SIZE    = atoi (para[3]);
  39.     LENDIT  = COLLECT + 1;
  40.     str this      = para[1];
  41.     int lenstr    = strlen (this);
  42.     str it        = "dlup";
  43.     int lenchar[] = { 10, 26, 26, 32 };
  44.     int len       = 0;
  45.     int pos       = 0;
  46.     str CHAR[]    = {
  47.         "0123456789",
  48.         "abcdefghijklmnopqrstuvwxyz",
  49.         "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
  50.         "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
  51.     };
  52.     int indes[4];

  53.     for (int i = 0; i < 4; i++) {
  54.         for (int j = 0; j < lenstr; j++) {
  55.             if (it[i] == this[j]) {
  56.                 len         += lenchar[i];
  57.                 indes[pos++] = i;
  58.                 break;
  59.             }
  60.         }
  61.     }

  62.     LENSTR = len;
  63.     STR = calloc (LENSTR + 1, sizeof(kar));
  64.     for (int i = 0; i < pos; i++)
  65.         strcat (STR, CHAR[indes[i]]);
  66. } /* init */

  67. void test (){
  68.     telle (1);
  69.     quit (0);
  70. }

  71. void quit (int n){
  72.     free (STR);
  73.     exit (n);
  74. }

  75. void explore (str part){
  76.     telle (0);
  77.     int n = atoi (part);
  78.     if (n < 0 || n > MEKS) {
  79.         printf ("ERROR: N = %d\t[N: 0 .. %llu]\n", n, MEKS);
  80.         quit (1);
  81.     }

  82.     kar dit[LENDIT];
  83.     dit[LENDIT - 1] = 0;
  84.     DIT             = dit;
  85.     int has[LENSTR];
  86.     HAS = has;
  87.     kar dat[LENSTR];
  88.     DAT = dat;
  89.     Int begin = GLOB * n;
  90.     Int end   = begin + GLOB;
  91.     if (end >= FINISH) end = FINISH + 1;

  92.     for (Int i = begin; i < end; i++) {
  93.         memset (has, 0, LENSTR * sizeof(int));
  94.         gene (i);
  95.         floor42 (HEAD);
  96.     }

  97.     free (STR);

  98. } /* explore */
  99. void telle (int TEST){
  100.     Int size = COLLECT + 1;
  101.     Int G    = 1024 * 1024 * 1024ULL;
  102.     Int max  = SIZE * G / size; // B
  103.     Int part = 1;
  104.     dub toto;

  105.     for (int i = LENSTR; i >= 0; i--) {
  106.         part *= i;
  107.         Int s = 1;
  108.         for (int j = i; j > LENSTR - COLLECT; j--) s *= j;
  109.         if (i == LENSTR) {
  110.             toto = s * size / (dub)G;
  111.             if (TEST) printf ("SIZE  =\t%.2f G\n", toto);
  112.         }
  113.         if (s <= max) {
  114.             HEAD   = LENSTR - i;
  115.             FINISH = part / i - 1;
  116.             dub partX = s * size / (dub)G;
  117.             GLOB = SIZE > toto ? 0 : SIZE / partX;
  118.             dub M1 = toto / (partX * GLOB);
  119.             Int M2 = M1;
  120.             MEKS = SIZE > toto ? FINISH : M2 - (M1 == M2);

  121.             if (GLOB) partX *= GLOB;
  122.             if (TEST) {
  123.                 printf ("RANGE =\t0 .. %llu\n", MEKS);
  124.                 printf ("PARTX =\t%.2f G\n", partX);
  125.             }

  126.             break;
  127.         }
  128.     }
  129. } /* telle */

  130. void gene (int n){
  131.     int low = LENSTR - HEAD + 1;
  132.     int mod[HEAD];

  133.     for (int i = 1; i <= HEAD; i++) {
  134.         int val = 1;
  135.         for (int j = low; j <= LENSTR - i; j++) val *= j;
  136.         mod[i - 1] = val;
  137.     }
  138.     int head[HEAD];
  139.     int posi[LENSTR];

  140.     memset (posi, 0, LENSTR * sizeof(int));

  141.     for (int i = 0; i < HEAD; i++) {
  142.         int val = n / mod[i];
  143.         int k   = 0;
  144.         for (int j = 0; j < LENSTR; j++) {
  145.             if (posi[j]) continue;
  146.             if (k++ == val) {
  147.                 posi[j] = 1;
  148.                 head[i] = j;
  149.                 DIT[i]  = STR[j];
  150.             }
  151.         }
  152.         n %= mod[i];
  153.     }

  154.     int h = HEAD;
  155.     for (int i = 0; i < LENSTR; i++) {
  156.         int ok = 1;
  157.         for (int j = 0; j < HEAD; j++)
  158.             if (i == head[j]) {
  159.                 ok--; break;
  160.             }

  161.         if (ok) DAT[h++] = STR[i];
  162.     }

  163. } /* gene */

  164. void floor42 (int indes){
  165.     if (indes == COLLECT) {
  166.         puts (DIT);
  167.         return;
  168.     }

  169.     for (int i = HEAD; i < LENSTR; i++) {
  170.         if (HAS[i]) continue;
  171.         HAS[i]     = 1;
  172.         DIT[indes] = DAT[i];
  173.         floor42 (indes + 1);
  174.         HAS[i] = 0;
  175.     }
  176. }

  177. void help (str app){
  178.     printf ("USE:\ntest:\n%s str chars size[G]\n", app);
  179.     printf ("%s dlu 8 6\n", app);
  180.     printf ("run:\n%s str chars size[G] part > partX\n", app);
  181.     printf ("%s dlu 8 6 0 > part0\n", app);
  182.     exit (1);
  183. }
复制代码




论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-03 07:15 |显示全部楼层
回复 22# rubyish

下面这些是与21楼的问题无关,是另外的问题,千万别混了。

一、这个15楼的我没完全看明白,不知道 ./floor15 dlu 8 5 0 > p0 是什么意思
我的意思是,为什么
./floor15 dlu 8 5 0 > p0
./floor15 dlu 8 5 1 > p1
.
.
.
./floor15 dlu 8 5 547 > p547
上面的共0-547个都没有输出?

./floor15 dlu 8 5 548 > p548
只有548这一个有输出?

所以导致我,下面这两个不会比较效率
./floor42C  dlu 8 5 549 | ./sieve > saveF42
./floor15 dlu 8 5 549 > saveF15

另,参考17楼的第二种情况,只是简单试了下效率
./floor15 dlu 8 100 28      (0-27个也是什么也没有输出,只有28有输出)

real    14m4.842s
user    13m31.330s
sys     0m20.701s

输出:46.1GB


二、首先谢谢大牛的严谨、追求完美。但,22楼的脚本,没看明白什么意思,测试时,一直在运行状态,我手动停止了
用简单文档测试的
./sieveA < datafile > savesomething

同样文档下,sieve.c能运行的







论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-04 15:28 |显示全部楼层
本帖最后由 karma303 于 2017-11-04 16:04 编辑

磁盘IO也是性能瓶颈之一。
题主用的什么操作系统,文件系统?
这些特殊行(就是Mn,mn,mN之类的)占总行数的百分之几?
这些特殊行出现的“行为”?也就是,通常隔多少行出现一个?最少隔几行出现一次?最多隔多少行出现一次?
你这个大文件的普通行的"行为"?也就是,通常一行有多长?最短多少?最长能有多长?

不涉及机密的话,不如截取个10K的文件上传,这样为你编写C程序时,容易做优化,心里也踏实。
另外处理后的结果你希望怎么保存?————是直接生成新文件?还是需要打印到屏幕再重定向到文件(你很需要这个功能吗)。至少你测试性能时要留心:写stdout和写磁盘文件是两个概念,两者的速度不一样。直接生成新文件的话,可以用linux异步io的api,就是,一边往下解析行,一边把刚才解析完的内容写入磁盘。(我对异步io的api还不熟,不知道它跟管道配合的怎么样)

评分

参与人数 1信誉积分 +10 收起 理由
rubyish + 10 赞一个!

查看全部评分

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-04 15:28 |显示全部楼层
本帖最后由 karma303 于 2017-11-04 15:30 编辑

delete--------------------------------------------------------------

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-05 05:14 |显示全部楼层
回复 25# karma303



首先,非常感谢大牛的进来回复

真不容易,我的这两个帖子加起来近上万的浏览量,没人说句话。只有  rubyish  这位非常热心的大牛在他繁忙之余尽力出手帮助,令人感动。我理解可能是C语言太难了,学习到已经明白的人很少

你能进来回复,说明你肯定是大牛


你说了那么多疑问都正确

但,唯一一点,只是希望你抽功夫,占用你一点时间,把这个帖子及其中的链接,仔细看完后,肯定会明白的。因为一句话两句话说不清楚

如果帖子里面我没解释清楚,  rubyish  也不会进来帮助的。但,人家时间精力有限,不可能在帖子里面没完没了的帮助下去的,我明白。帮到这样,我就非常感谢人家了!

我知道你看完整个帖子会很累,也不一定有那么多时间,如果这样,我只能无语中。谢谢


再次感谢







论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2017-11-07 23:32 |显示全部楼层
上面的共0-547个都没有输出?

01234567
01234568
.....


就删除该行
1、行中任何位置有 两个及以上 紧靠在一起的纯数字的行(如: dtUV56yfw    123bdtez 等等)

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-09 03:00 |显示全部楼层
歪个楼
https://github.com/karma303/large_file_ayncs_io

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-09 06:53 |显示全部楼层
本帖最后由 bmne 于 2017-11-09 10:19 编辑

回复 29# karma303

完了、完了,要出人命!

本来我只想弄个手榴弹,结果让 rubyish  大牛给直接上星了(定点开炸清除),这下好了你大牛这次又弄来导弹,开花暴炸。

别说设计导弹,让我操作都要好好经过专门培训。驾驭导弹难。

藏龙卧虎,不到时候你大牛不会出手的,看来是把你给硬逼出来了(申请十万个专利,不放在导弹里面实际炸一下,确实没法检验实效)。

谢谢、谢谢,确实辛苦,浪费了大量的时间,不好意思中


既然来了,我就不会放过大牛你
问题:    (你可知道 rubyish 大牛,这次连续帮助解决了两大问题?就是大数据生成与生成的大数据的处理)
希望你再抽空看看
http://bbs.chinaunix.net/thread-4289664-3-1.html
上面的23楼的提出(但愿是个客观正确的问题,不是让人看不懂的问题,我已尽力说明白了)
如果你要继续追溯此源头,请看
http://bbs.chinaunix.net/thread-4267655-1-1.html

还是上面那句话,我是个扔手榴弹的,所以,我想驾驭导弹,要好好学习。若设计导弹,即使上断头台也只能咔嚓我了。请理解!

(自己先自言自语下)希望我有同遇到 rubyish 一样的好运气,得到帮助!



不说了,我要学习去了



您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP