perl 问题请教

perl 问题请教

大家好,有一个文本解析的问题不知如何来实现。
文本实例如下:

A        73
A        58
A        43
B        51
B        89
B        86
B        1675
B        39
C        69
D        57
D        38
E        36
E        44
E        85
E        64
E        103
E        36

文件用\t隔开。

现在想输出对应每个字母的前两行,如果对应行只有一行(如C),则输出一行。即输出格式如下:
A        73
A        58
B        51
B        89
C        69
D        57
D        38
E        36
E        44

因为文件很大,内存不够,所以需要按行,或者按块输入(比如先输入标示A的行)。请问各位大虾有没有办法?

多谢多谢
perl -ne '@ff = split;print if $f1{$ff[0]}++ < 2;' file


QUOTE:
原帖由 ynchnluiti 于 2008-11-9 13:46 发表
perl -ne '@ff = split;print if $f1{$ff[0]}++ < 2;' file

没有看懂~~能否解释一下,谢谢:) 


QUOTE:
原帖由 wanggd1983 于 2008-11-9 13:50 发表



没有看懂~~能否解释一下,谢谢:) 

看看 perl 的 -n, -e 选项都是什么意思,看看 Perl 的内置函数 split 是什么意思,然后你就懂了。


QUOTE:
原帖由 MMMIX 于 2008-11-9 13:57 发表

看看 perl 的 -n, -e 选项都是什么意思,看看 Perl 的内置函数 split 是什么意思,然后你就懂了。

-n loops over and does not print input.
-e specifies Perl expressions. More than one can be used, if needed. Other options should not follow this option.

其实我还是不懂~

这里是把文件全部读入然后在做判断吧?

我试着键入这一行命令,结果是没有找到文件。 这里的file是否是输入文件? 我打入了文件的储存地址 D:\\test.txt ,但是不行 (d:\test.txt; d:/test.txt 都不行)

小弟菜鸟一个,这是第一次接触 perl的one liner :)


QUOTE:
原帖由 ynchnluiti 于 2008-11-9 13:46 发表
perl -ne '@ff = split;print if $f1{$ff[0]}++ < 2;' file

perl -ane 'print if $h{$F[0]}++ < 2' urfile


QUOTE:
原帖由 flw 于 2008-11-9 14:22 发表

perl -ane 'print if $h{$F[0]}++ < 2' urfile

都是牛人哈~

恩,怎么输出到一个文件里~? 为啥在dos下这几个命令打进去都不行呢~

跳出这个提示: “The system cannot find the file specified”

那就试试把单引号改成双引号。


QUOTE:
原帖由 flw 于 2008-11-9 14:37 发表
那就试试把单引号改成双引号。

可以了。怎么把结果输出到一个文件里呢?

还有,可否解释一下 $h{$F[0]}++<2 这个的含义? 或者解释一下这个one liner是如何实现的? 不胜感激:)


QUOTE:
原帖由 wanggd1983 于 2008-11-9 14:43 发表


可以了。怎么把结果输出到一个文件里呢?

还有,可否解释一下 $h{$F[0]}++

以第一个字段为键值生成散列,第一字段出现次数小于2则输出

QUOTE:
perl --help

Usage: perl [switches] [--] [programfile] [arguments]
  -a              autosplit mode with -n or -p (splits $_ into @F)
  ...
  -e program      one line of program (several -e's allowed, omit programfile)
   ....
  -n              assume "while (<>) { ... }" loop around program
  -p              assume loop like -n but print line also, like sed