免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bmne
打印 上一主题 下一主题

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

论坛徽章:
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
11 [报告]
发表于 2017-10-29 02:49 |只看该作者
回复 9# bmne

4: shishidelete line 15, 16, 17, 18, 28
line12:    void explore (void);
line 19:    explore ();
line 27:    void explore (){
line 37:        while (fgets (line, LENGTH, stdin)) {


3: 42 you cuowu, 42C shi xinbanben.
2: line 24 '\n' xiugai wei '\r'
1: sudu bu lixiang.

论坛徽章:
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
12 [报告]
发表于 2017-10-29 07:24 |只看该作者
回复 11# rubyish



请帮助的问题:
怎样把 floor42C.c  与  shishi.c  这两个脚本,用“管道”连接在一起后,全自动一次性运行,直接输出结果?
(就像如同  awk  ......  file|awk  ...... file2  这种管道形式)

你说过的话;
shishidelete line 15, 16, 17, 18, 28
line12:    void explore (void);
line 19:    explore ();
line 27:    void explore (){
line 37:        while (fgets (line, LENGTH, stdin)) {

然后我的操作:
我在  shishi.c  里面分别全改动了line12、19、27、37这四项后,不能用。
也看不明白你说的shishidelete line 15, 16, 17, 18, 28是什么意思。
更不明白,你这样改动怎样就会变成,用“管道”把两个脚本连接在一起,自动一次性运行的新的脚本

我笨(曾多次尝试分别改变 floor42C.c 及 shishi.c  都没修改正确)

请再辛苦,谢谢!






论坛徽章:
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
13 [报告]
发表于 2017-10-29 07:54 |只看该作者
回复 11# rubyish



另外的三个问题,我不想再说了,怕误导了我上面的主要的求助的问题。

简单回复下另外的三个问题
1、你大牛专业,工作就是严谨。对于这个速度的效率,你不是十分满意,但,我认为足够快的了,可以了,用正则的没法比
2、关于格式的问题:line 24 '\n' xiugai wei '\r',替换后,在dos格式中确实好用了。但,我没解释清楚,我的意思是,要做到自动识别格式文档通用型,不能手动自己改来改去,我尝试自动没成功。
3、关于  floor42.c  与  floor42C.c  不说了,先放下,就这样吧





论坛徽章:
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
14 [报告]
发表于 2017-10-29 23:31 |只看该作者
本帖最后由 rubyish 于 2017-10-29 19:53 编辑

回复 13# bmne

unix + dos geshi de tongyong:
  1. # define END '\r'
复制代码

change:
  1. if (*dit == END) fputs (line, stdout);
复制代码

to:
  1. if (*dit <= END) fputs (line, stdout);
复制代码
dan you yige xianzhi:linux shiyong unix geshi, windo shiyong dos geshi => OK
linux shiyong dos gesshi, windo shiyong unix geshi => NO

shishidelete ===> shishi delete ~~
example: sieve.c
  1. ./floor42C dlu 8 5 1256 | ./sieve > part1256
复制代码
  1. ./sieve < datafile > savesomething
复制代码


or: shiyong sh
dluX.sh:
  1. /yourdir/floor42C dlu 8 5 $1 | /yourdir/sieve
复制代码

chmod +x dluX.sh
run:
  1. ./dluX.sh 1256 > part1256
复制代码


sieve.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. # define isdigit(X) X < 58
  11. # define END '\n'
  12. # define MN  3
  13. void sieve (){
  14.     kar line[LENGTH];
  15.     int X[123] = {
  16.         ['m'] = 1,
  17.         ['M'] = 1,
  18.         ['n'] = 2,
  19.         ['N'] = 2,
  20.     };

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

  25.         while (*dit > END) {
  26.             if (isdigit (*dit)) {
  27.                 if (isdigit (*dat)) break;
  28.             } else {
  29.                 if ((var (*dit) | var (*dat)) == MN) break;
  30.             }
  31.             dit++;
  32.         }
  33.         if (*dit == END) fputs (line, stdout);
  34.     }
  35. }
复制代码



论坛徽章:
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
15 [报告]
发表于 2017-10-30 00:44 |只看该作者
shishi floor15:

./floor15 dlu 8 5 0 > p0
output:
  1. part0 is EMPTY, next = 549
复制代码

part0 .. part548 => EMPTY
biru:
012...
013...

./floor15 dlu 8 5 549 > p549
shiyong fangshi xiangtong

  1. ./floor42C  dlu 8 5 549 | ./sieve > saveF42
复制代码
  1. ./floor15 dlu 8 5 549 > saveF15
复制代码


floor15.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 telle (int);
  21. void test (void);
  22. void explore (str);
  23. void help (str);
  24. void mnemonic (int);
  25. void init (str *);
  26. void quit (int);
  27. Int next (Int);
  28. int ok (void);
  29. int prelude (int);

  30. /* ____________________ MAIN ____________________ */

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

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

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

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

  69. void test (){
  70.     telle (1);
  71.     quit (0);
  72. }

  73. void quit (int n){
  74.     free (STR);
  75.     exit (n);
  76. }

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

  84.     kar dit[LENDIT];
  85.     dit[LENDIT - 1] = 0;
  86.     DIT             = dit;

  87.     int has[LENSTR];
  88.     HAS = has;
  89.     kar dat[LENSTR];
  90.     DAT = dat;
  91.     Int Next = next (n);
  92.     if (Next > (Int)n) {
  93.         printf ("part%d is EMPTY, next = %llu\n", n, Next);
  94.         quit (1);
  95.     }

  96.     Int begin = GLOB * n;
  97.     Int end   = begin + GLOB;
  98.     if (end >= FINISH) end = FINISH + 1;

  99.     for (Int i = begin; i < end; i++) {
  100.         if (!prelude (i)) continue;
  101.         memset (has, 0, LENSTR * sizeof(int));
  102.         mnemonic (HEAD);
  103.     }

  104.     free (STR);

  105. } /* explore */
  106. void telle (int TEST){
  107.     Int size = COLLECT + 1;
  108.     Int G    = 1024 * 1024 * 1024ULL;
  109.     Int max  = SIZE * G / size; // B
  110.     Int part = 1;
  111.     dub toto = 0.0;

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

  128.             if (GLOB) partX *= GLOB;
  129.             if (TEST) {
  130.                 // printf ("HEAD  =\t%d\n", HEAD);
  131.                 // printf ("GLOB  =\t%llu\n", GLOB);
  132.                 printf ("RANGE =\t0 .. %llu\n", MEKS);
  133.                 printf ("PARTX =\t%.2f G\n", partX);
  134.             }

  135.             break;
  136.         }
  137.     }
  138. } /* telle */

  139. # define isdigit(N) N < 58
  140. # define MN 3
  141. int ok (){
  142.     static int data[123] = {
  143.         ['M'] = 1,
  144.         ['m'] = 1,
  145.         ['N'] = 2,
  146.         ['n'] = 2,
  147.     };

  148.     # define This DIT[h]
  149.     # define That DIT[h - 1]
  150.     # define Var(X) data[(int)X]
  151.     for (int h = 1; h < HEAD; h++) {
  152.         if (isdigit (This)) {
  153.             if (isdigit (That)) return 0;
  154.         } else {
  155.             if ((Var (This) | Var (That)) == MN) return 0;
  156.         }
  157.     }
  158.     return 1;
  159. }

  160. Int next (Int n) {
  161.     for (Int j = n; j <= MEKS; j++) {
  162.         Int begin = GLOB * j;
  163.         Int end   = begin + GLOB;
  164.         if (end >= FINISH) end = FINISH + 1;
  165.         for (Int i = begin; i < end; i++)
  166.             if (prelude (i)) return j;
  167.     }
  168.     return 0;
  169. } /* next */

  170. int prelude (int n){
  171.     int low = LENSTR - HEAD + 1;
  172.     int mod[HEAD];

  173.     for (int i = 1; i <= HEAD; i++) {
  174.         int val = 1;
  175.         for (int j = low; j <= LENSTR - i; j++) val *= j;
  176.         mod[i - 1] = val;
  177.     }
  178.     int head[HEAD];
  179.     int posi[LENSTR];

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

  181.     for (int i = 0; i < HEAD; i++) {
  182.         int val = n / mod[i];
  183.         int k   = 0;
  184.         for (int j = 0; j < LENSTR; j++) {
  185.             if (posi[j]) continue;
  186.             if (k++ == val) {
  187.                 posi[j] = 1;
  188.                 head[i] = j;
  189.                 DIT[i]  = STR[j];
  190.             }
  191.         }
  192.         n %= mod[i];
  193.     }
  194.     if (!ok ()) return 0;

  195.     int h = HEAD;
  196.     for (int i = 0; i < LENSTR; i++) {
  197.         int ok = 1;
  198.         for (int j = 0; j < HEAD; j++)
  199.             if (i == head[j]) {
  200.                 ok--; break;
  201.             }

  202.         if (ok) DAT[h++] = STR[i];
  203.     }
  204.     return 1;
  205. } /* prelude */

  206. void mnemonic (int indes){
  207.     static int var[123] = {
  208.         ['M'] = 1,
  209.         ['m'] = 1,
  210.         ['N'] = 2,
  211.         ['n'] = 2,
  212.     };

  213.     if (indes == COLLECT) {
  214.         puts (DIT);
  215.         return;
  216.     }

  217.     # define THIS DAT[i]
  218.     # define THAT DIT[indes - 1]
  219.     # define VAR(X) var[(int)X]
  220.     for (int i = HEAD; i < LENSTR; i++) {
  221.         if (HAS[i]) continue;
  222.         if (indes) {
  223.             if (isdigit (THIS)) {
  224.                 if (isdigit (THAT)) continue;
  225.             } else {
  226.                 if ((VAR (THIS) | VAR (THAT)) == MN) continue;
  227.             }
  228.         }
  229.         HAS[i]     = 1;
  230.         DIT[indes] = DAT[i];
  231.         mnemonic (indes + 1);
  232.         HAS[i] = 0;
  233.     }
  234. } /* mnemonic */

  235. void help (str app){
  236.     printf ("USE:\ntest:\n%s str chars size[G]\n", app);
  237.     printf ("%s dlu 8 6\n", app);
  238.     printf ("run:\n%s str chars size[G] part > partX\n", app);
  239.     printf ("%s dlu 8 6 0 > part0\n", app);
  240.     exit (1);
  241. }
复制代码

论坛徽章:
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
16 [报告]
发表于 2017-10-30 12:59 |只看该作者
回复 15# rubyish


大牛
和你开个玩笑。猜一下,估计你在新西兰或澳洲

人若是遇到贵人,确实不容易,我等了一年零八个月,让我遇上了,运气好,问题一个一个解决掉了

谢谢大牛倾力帮助,辛苦你了,浪费了你很多脑细胞

我敢肯定,在你最近的连续的多个脚本写出来之后,肯定有很多人对C语言会有新的认识

娴熟的技术、热心+耐心的人品,我敢肯定尊重你的人应该很多的。赞一个!

我正在努力整理文档,比较、判断文档中。用来最终选择保存好你的脚本






论坛徽章:
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
17 [报告]
发表于 2017-10-30 16:02 |只看该作者
本帖最后由 bmne 于 2017-10-30 16:28 编辑

回复 14# rubyish



同样一个文档提取出是56.5GB  然后再整理后是52.9GB

看看下面的时间运行情况

1、如:分别两次运行

./floor42C

real    17m3.948s
user    16m23.148s
sys     0m23.789s


./shishi

real    34m34.354s
user    27m30.131s
sys     0m37.409s

用另一个  ./sieve

real    12m59.879s
user    12m14.281s
sys     0m13.524s


2、如:改成一次性运行出结果

./floor42C   .... | ./sieve


real    28m28.046s
user    45m21.998s
sys     0m41.574s



谢谢大牛的脚本,又提速了!!!










论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
18 [报告]
发表于 2017-10-30 16:50 |只看该作者
回复 10# 1cpuer


I 忽略大小写

论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-05-11 06:20:00操作系统版块每日发帖之星
日期:2016-05-12 06:20:00每日论坛发贴之星
日期:2016-05-12 06:20:00操作系统版块每日发帖之星
日期:2016-05-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-31 06:20:00每日论坛发贴之星
日期:2016-05-31 06:20:00
19 [报告]
发表于 2017-10-30 17:11 |只看该作者
回复 18# wh7211

好像看到过
sed --help 和 man sed 中,又好像没发现?


论坛徽章:
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
20 [报告]
发表于 2017-10-31 01:43 |只看该作者
本帖最后由 rubyish 于 2017-10-30 22:07 编辑

回复 17# bmne

3Q ~~
nide test youyisi.

shishi.c    = v1
shishiA.c   = v2
shishiB.c   = v3
shishiC.c   = v4 => sieve.c

v1 zhihoude A, B, C.. doushi zhendui v1 de jiasu banben.
dan wode ceshi que faxian meiyou renhe yige banben zai sudushang keyi qaoyue shishi.c de.  


you biduiguo shuchude hangshu ma?
biru:
  1. shishi ... > A
  2. sieve ... > B
  3. wc -l A B
复制代码



you ceshi floor15 ma?
ru:
floor42C + sieve = 28m [ 17 + 12 ]
wode yuqi:
floor15 = 15m ~ 20m

zai line 254:
  1. if (indes) {
  2.     if (isdigit (THIS)) {
  3.         if (isdigit (THAT)) continue;
  4.     } else {
  5.         if ((VAR (THIS) | VAR (THAT)) == MN) continue;
  6.     }
  7. }
复制代码


keyi xiugai wei: [ if head always > 0 ]
  1. if (isdigit (THIS)) {
  2.     if (isdigit (THAT)) continue;
  3. } else {
  4.     if ((VAR (THIS) | VAR (THAT)) == MN) continue;
  5. }
复制代码






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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP