2011-06-08 40 views
1

的去线线路所以我有每行一个ID的第一文件,例如:搜索一个文件中包含的第二文件

458-12-345 
466-44-3-223 
578-4-58-1 
599-478 
854-52658 
955-12-32 

然后,我有一个第二文件。它有在每个文件中,随后的信息的ID,例如:

111-2457-1 0.2545 0.5484 0.6914 0.4222 
112-4844-487 0.7475 0.4749 0.1114 0.8413 
115-44-48-5 0.4464 0.8894 0.1140 0.1044 

....

第一个文件只具有1000行,与所述信息予需要的ID,而第二文件有超过20万行。

我与好成绩的Fedora使用以下bash命令:

cat file1.txt | while read line; do cat file2.txt | egrep "^$line\ "; done > file3.txt 

但我现在正在试图复制在Ubuntu的结果,而输出是一个空文件。这是不是有理由在Ubuntu下工作?

谢谢!

回答

1

awk的典型职业:

awk 'FNR==NR{i[$1]=1;next} i[$1]{print}' file1 file2 

这将打印第二个文件是在第一个索引行。为了获得更多速度,请使用mawk。

+0

谢谢,这在Fedora和Cygwin上都很完美,它的速度也非常快,所以这是一个很大的改进。它在我的Ubuntu上没有工作,所以我相信有些东西是错的。 – Xosen 2011-06-08 14:59:17

+0

应该在你的Ubuntu上运行。它甚至应该和1977年的老式传统awk一起工作。它会抛出任何错误吗? – ripat 2011-06-08 15:51:45

0

这条线工作正常,我在Ubuntu:

cat 1.txt | while read line; do cat 2.txt | grep "$line"; done 

然而,这可能是缓慢的第二个文件(200000行)(在第一个文件的行数)将被grepped 1000次

2

您可以一次用grep几个字符串:

grep -f id_file data_file 

假设id_file包含了所有的ID和DATA_FILE包含ID和数据。

+1

很好的使用grep,但不适合大文件。在1000行和200000行文件上做了一些测试,awk大约快了两倍。 – ripat 2011-06-08 16:05:27

相关问题