搜索
查看: 4996|回复: 3

文件操作 perl one line 某同学问题的解答

[复制链接]

21

主题

51

帖子

176

积分

信息监察员

Rank: 9Rank: 9Rank: 9

积分
176
发表于 2016-9-17 23:49:00 | 显示全部楼层 |阅读模式
前几天有位同学问了一个问题,两个文件,
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: (以冒号分割)类似的语句来实现。
大家有什么疑问欢迎留言和我交流。





学习的痛苦是一时的,学到的快乐是长久的。
回复

使用道具 举报

4

主题

29

帖子

119

积分

注册会员

Rank: 2

积分
119
发表于 2016-9-19 14:00:16 | 显示全部楼层
准备看<perl one line>,一句话命令要好好学学啊
回复 支持 反对

使用道具 举报

21

主题

51

帖子

176

积分

信息监察员

Rank: 9Rank: 9Rank: 9

积分
176
 楼主| 发表于 2016-9-20 17:25:04 | 显示全部楼层
深藏功与名 发表于 2016-9-19 14:00
准备看,一句话命令要好好学学啊

加油
学习的痛苦是一时的,学到的快乐是长久的。
回复 支持 反对

使用道具 举报

21

主题

51

帖子

176

积分

信息监察员

Rank: 9Rank: 9Rank: 9

积分
176
 楼主| 发表于 2016-9-21 23:01:20 | 显示全部楼层
自己给自己回个贴,我对一句话perl不熟,我是在旅行回京的大巴上看的相关资料,因为我预见到如果这个帖子再不发出来又不知拖到什么时候了,我忍着困意和摇晃的视野看了看 perl one liners 这本书。回来后简单整理了一下 就发出来了。重点是因为整理了这个帖子对程序的理解更加深刻了,以至于今天居然直接就用上了,不由得感慨,学习的痛苦是一时的,学到的快乐会是永久的,so,加油吧,掌握一个技能也许就是分分钟的事。
学习的痛苦是一时的,学到的快乐是长久的。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2022-8-18 06:55 , Processed in 0.115258 second(s), 37 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.