|
前几天有位同学问了一个问题,两个文件,
A文件
123
456
B文件
123 AAA
456 BBB
789 CCC
需要从B文件中提取出包含A文件的行。A 文件有200万行,B文件大概有5亿行。
@深圳-南山-居士 给出了答案
cat a.txt b.txt|perl -alne '{$h{$_}=1 unless $F[1]; print if exists $h{$F[0]} and $F[1]}'
这是在命令行写的perl小程序,又叫一句话perl.
下面我详细给大家介绍一下这段程序的意思,首先是将两个文件cat到一起,最为标准输入给到后面的perl程序,perl逐行读取信息,默认以空白符作为分隔符分割文件,如果第二列未defined,那么就建立一个哈希,哈希键值为1,后面判断如果哈希键存在并且第二列有值,打印该行。大家看明白了吗,这段程序的核心思想是利用两个文件第二列有无值来设计的。
下面简单介绍一下程序参数 -a 表示以空白符分割列并存入数组@F, -l表示print后加一个换行符(貌似这里如果已经有换行符就不再加了), -n 代表逐行读入数据,类似while(<>){}, -e表示执行的意思。 如果想指定分隔符,可以用 -F: (以冒号分割)类似的语句来实现。
大家有什么疑问欢迎留言和我交流。
|
|