Chinaunix

标题: 新手问题:如何将文件里两行合并为一行(含具体文件格式)? [打印本页]

作者: jyleon24    时间: 2009-03-25 13:49
标题: 新手问题:如何将文件里两行合并为一行(含具体文件格式)?
文件格式如下,要处理大量这类数据,第一行开头有8个\s,第二行开头有22个\s
本人是perl新手,功力不够,请大侠指点,谢谢了
        chain "chain0" = "11011101110101101000101010000111100001000000110001\
                      10110010010010000011000011110010111101000110110001";

[ 本帖最后由 jyleon24 于 2009-3-25 13:50 编辑 ]
作者: MMMIX    时间: 2009-03-25 14:07
Perl 的功力先放一边,先把你描述问题的功力好好练练。
作者: shucho    时间: 2009-03-25 14:11
貌似再说第一行开头有8个空格,第二行开头有22个空格,接下来要解析出什么东西来呢?
作者: chenzq1604    时间: 2009-03-25 14:22
  怎么个处理法?
作者: jyleon24    时间: 2009-03-25 14:37
不好意思,就是如标题所说一样,把这两行并成一行,例如:
        chain "chain0" = "11011101110101101000101010000111100001000000110001\
                      10110010010010000011000011110010111101000110110001";
处理为:
        chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";

貌似页面可显示的长度不够,就是把第二行添加到第一行的末尾,把两行合并成一行

[ 本帖最后由 jyleon24 于 2009-3-25 14:39 编辑 ]
作者: redmaple_v1    时间: 2009-03-25 14:38
偶还是没有看懂呢。。

“忽略这句话”

[ 本帖最后由 redmaple_v1 于 2009-3-25 14:58 编辑 ]
作者: jyleon24    时间: 2009-03-25 14:42
我把数据改短一点,应该好一点:
原数据:
        chain "chain0" = "110011001000000110001\
                      101100100001100110001";

正如三楼说的一样,第一行开头有8个空格,第二行开头有22个空格
处理为:
        chain "chain0" = "110011001000000110001\101100100001100110001";
作者: marscld    时间: 2009-03-25 14:59
试试先 split(), 再 join(). 这两个函数在perl文档中可查
作者: which    时间: 2009-03-25 15:01

  1. #!/usr/bin/perl -w

  2. open FILE ,"text.txt";
  3. read(FILE,$text,-s "text.txt");
  4. print $text;

  5. $text =~ s/(\t+)(.*?)(?:\n|\t)+(.*)/$1$2$3/s;
  6. print $text;
复制代码

[ 本帖最后由 which 于 2009-3-25 15:03 编辑 ]
作者: which    时间: 2009-03-25 15:08

  1. #!/usr/bin/perl -w

  2. open FILE ,"text.txt";
  3. read(FILE,$text,-s "text.txt");
  4. print $text;

  5. $text =~ s/(\t+.*?)(?:\n|\t)+(.*)/$1$2/s;
  6. print $text;
复制代码

作者: which    时间: 2009-03-25 15:16

  1. #!/usr/bin/perl -w

  2. open FILE ,"text.txt";
  3. read(FILE,$text,-s "text.txt");
  4. print $text;

  5. $text =~ s/\n(\t)+//s;
  6. print $text;
复制代码

作者: jyleon24    时间: 2009-03-25 15:28
谢which,不过貌似都不行啊
作者: which    时间: 2009-03-25 15:32
原帖由 jyleon24 于 2009-3-25 15:28 发表
谢which,不过貌似都不行啊

哦?
出了什么事?
作者: redmaple_v1    时间: 2009-03-25 15:44
原帖由 which 于 2009-3-25 15:32 发表

哦?
出了什么事?


#!/usr/bin/perl -w


open FILE ,"text.txt";
read(FILE,$text,-s "text.txt");
print $text;

$text =~ s/\n\s+//s;
print $text;


改了哈which的代码,莫见怪。现在应该可以了。
作者: redmaple_v1    时间: 2009-03-25 15:46
问一下which, \t  是啥意思,从来没有见过呢,我也刚接触perl。。
作者: chenzq1604    时间: 2009-03-25 16:06
原帖由 jyleon24 于 2009-3-25 15:28 发表
谢which,不过貌似都不行啊



这样行不:

  1. [~]$ cat text
  2.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  3.                       10110010010010000011000011110010111101000110110001";
  4.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  5.                       10110010010010000011000011110010111101000110110001";
  6.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  7.                       10110010010010000011000011110010111101000110110001";
  8.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  9.                       10110010010010000011000011110010111101000110110001";
  10.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  11.                       10110010010010000011000011110010111101000110110001";
  12.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  13.                       10110010010010000011000011110010111101000110110001";
  14.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  15.                       10110010010010000011000011110010111101000110110001";
  16.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  17.                       10110010010010000011000011110010111101000110110001";
  18.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  19.                       10110010010010000011000011110010111101000110110001";
  20.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  21.                       10110010010010000011000011110010111101000110110001";
  22.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  23.                       10110010010010000011000011110010111101000110110001";
  24.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  25.                       10110010010010000011000011110010111101000110110001";
  26.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  27.                       10110010010010000011000011110010111101000110110001";
  28.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  29.                       10110010010010000011000011110010111101000110110001";
  30.         chain "chain0" = "11011101110101101000101010000111100001000000110001\
  31.                       10110010010010000011000011110010111101000110110001";


  32. [~]$ perl -ne 's/(^\s+chain.*?)\n/$1/;print' text |perl -ne 's/\\\s+(\d+)/\\$1/;print'
  33.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  34.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  35.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  36.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  37.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  38.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  39.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  40.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  41.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  42.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  43.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  44.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  45.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  46.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";
  47.         chain "chain0" = "11011101110101101000101010000111100001000000110001\10110010010010000011000011110010111101000110110001";



复制代码

作者: chenzq1604    时间: 2009-03-25 16:07
原帖由 redmaple_v1 于 2009-3-25 15:46 发表
问一下which, \t  是啥意思,从来没有见过呢,我也刚接触perl。。



\t  =tab
作者: redmaple_v1    时间: 2009-03-25 16:27
[quote]原帖由 redmaple_v1 于 2009-3-25 15:44 发表
next,可以进行多行了,并写入一个文件中。
#!/usr/bin/perl -w

use strict;
my $file;
open (FILE,"file")or die "can't open file $:!";
my @file=<FILE>;
close(FILE);
open (OUTFILE,">>out")or die "can't open out $:!";
foreach $file(@file){
    if($file =~ /[a-z]/){
        $file =~ s/\n//;
        print OUTFILE $file;
    }
    else{
        $file =~ s/\s+//;
        print OUTFILE $file;
    }   
}

作者: redmaple_v1    时间: 2009-03-25 16:28
原帖由 chenzq1604 于 2009-3-25 16:07 发表



\t  =tab


谢谢。。
作者: which    时间: 2009-03-25 16:43
原帖由 redmaple_v1 于 2009-3-25 16:27 发表
[quote]原帖由 redmaple_v1 于 2009-3-25 15:44 发表
next,可以进行多行了,并写入一个文件中。
#!/usr/bin/perl -w

use strict;
my $file;
open (F ...


我也仿照你的写了一个


  1. cat chop.pl

  2. #!/usr/bin/perl -w

  3. use strict;

  4. $^I = ".bak";

  5. while(<>)
  6. {
  7.         unless(/[a-z]/){
  8.                 $_ =~ s/\s+//;
  9.                 print;
  10.         }
  11.         else{
  12.                 $_ =~ s/\n//;
  13.                 print;
  14.         }   
  15. }


  16. # cat text.txt
  17.                         chain "chain0" = "110011001000000110001\
  18.                                                 101100100001100110001";
  19.                                           
  20.                         chain "chain0" = "110011001000000110001\
  21.                                                 101100100001100110001";
  22.                                           
  23.                         chain "chain0" = "110011001000000110001\
  24.                                                 101100100001100110001";

  25.                         chain "chain0" = "110011001000000110001\
  26.                                                 101100100001100110001";
  27. # ls
  28. chop.pl  text.txt
  29. # ./chop.pl text.txt
  30. # cat text.txt
  31.                         chain "chain0" = "110011001000000110001\101100100001100110001";
  32.                         chain "chain0" = "110011001000000110001\101100100001100110001";
  33.                         chain "chain0" = "110011001000000110001\101100100001100110001";
  34.                         chain "chain0" = "110011001000000110001\101100100001100110001";
  35. #
复制代码

作者: jyleon24    时间: 2009-03-25 16:53
谢谢各位,受教了
作者: redmaple_v1    时间: 2009-03-25 17:08
原帖由 which 于 2009-3-25 16:43 发表


我也仿照你的写了一个


cat chop.pl

#!/usr/bin/perl -w

use strict;

$^I = ".bak";

while()
{
        unless(/[a-z]/){
                $_ =~ s/\s+//;
                print; ...



哈哈,又学到一招,
$^I=".bak"是不是读后面的文件“test.txt”的意思?
作者: which    时间: 2009-03-25 17:58
原帖由 redmaple_v1 于 2009-3-25 17:08 发表



哈哈,又学到一招,
$^I=".bak"是不是读后面的文件“test.txt”的意思?


<>读命令行给出的文件。 $^I 是一种备份的用法。
作者: redmaple_v1    时间: 2009-03-26 09:44
原帖由 which 于 2009-3-25 17:58 发表


读命令行给出的文件。 $^I 是一种备份的用法。


谢谢详解!
作者: MMMIX    时间: 2009-03-26 11:07
原帖由 redmaple_v1 于 2009-3-25 17:08 发表


$^I=".bak"是不是读后面的文件“test.txt”的意思?

这个你在 perlvar 中查查 $^I 的意思就清楚了。
作者: redmaple_v1    时间: 2009-03-26 11:25
原帖由 MMMIX 于 2009-3-26 11:07 发表

这个你在 perlvar 中查查 $^I 的意思就清楚了。


谢谢MMMIX老大,我电脑里面没有找到perlvar,只有在网上搜到一个。
作者: MMMIX    时间: 2009-03-26 11:54
原帖由 redmaple_v1 于 2009-3-26 11:25 发表


谢谢MMMIX老大,我电脑里面没有找到perlvar,只有在网上搜到一个。

不会吧?perldoc 都没法用?或者是不知道有这个?
作者: redmaple_v1    时间: 2009-03-26 12:27
原帖由 MMMIX 于 2009-3-26 11:54 发表

不会吧?perldoc 都没法用?或者是不知道有这个?


额,说实话,不会用perldoc。能否简单介绍哈嘛?
作者: MMMIX    时间: 2009-03-26 14:22
原帖由 redmaple_v1 于 2009-3-26 12:27 发表


额,说实话,不会用perldoc。能否简单介绍哈嘛?

执行 perldoc perldoc 就可以看到 perldoc 的手册
作者: redmaple_v1    时间: 2009-03-26 15:57
原帖由 MMMIX 于 2009-3-26 14:22 发表

执行 perldoc perldoc 就可以看到 perldoc 的手册


谢了,但是偶下了一个网页版的perldoc,比命令行的看起要方便一些。
作者: 我为人民服务    时间: 2009-03-29 20:04
原帖由 MMMIX 于 2009-3-25 14:07 发表
Perl 的功力先放一边,先把你描述问题的功力好好练练。

呵呵
作者: MMMIX    时间: 2009-03-29 20:59
原帖由 redmaple_v1 于 2009-3-26 15:57 发表


谢了,但是偶下了一个网页版的perldoc,比命令行的看起要方便一些。

你觉得方便就好。
作者: cobrawgl    时间: 2009-03-29 21:17
这贴居然这么火




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2