匹配2个制表符分隔的文本文件

时间:2017-03-30 09:47:55

标签: bash perl

我有两个制表符分隔的.txt文件

file1有2000万行和以下结构

col1    col2    col3    col4    col5
1       x       x       A       x
2       y       y       A       x
3       z       z       A       x
4       x       x       B       x
5       x       y       B       x
6       x       y       E       x
7       x       z       F       x

file2有3000行和以下结构

col1
A
B
C
D

现在我想从file1中提取file1中的col1和file1的col4之间匹配的行

所以新文件3应该是这样的

col1    col2    col3    col4    col5
1       x       x       A       x
2       y       y       A       x
3       z       z       A       x
4       x       x       B       x
5       x       y       B       x

如何使用perl或bash执行此操作?

3 个答案:

答案 0 :(得分:0)

您可以使用标准awk命令加入2个文件:

awk 'BEGIN{FS=OFS="\t"} FNR == NR { a[$1]; next } $4 in a' file2 file1

答案 1 :(得分:0)

试试这个 -

awk -F'[ ]+' 'NR==FNR {a[$1]++;next} $4 in a{print $0}' f2 f1
1       x       x       A       x
2       y       y       A       x
3       z       z       A       x
4       x       x       B       x
5       x       y       B       x

答案 2 :(得分:0)

既然你也问过Perl,这里有一个可重用的perl解决方案。首先读取文件2,生成一个查找值数组,然后读取文件1,打印出第4列匹配上面创建的数组内部值的任何行。这样的事情可能有用:

return

您可以将其作为#!/usr/bin/perl use strict; use warnings; use autodie; my $key_file = shift; open(my $fh, "<", $key_file); my $header = <$fh>; # read the header line into '$h' my %keys = map{ chomp; $_ => 1 }<$fh>; close $fh; my $query_file = shift; open(my $q_fh, "<", $query_file); print scalar <$q_fh>; while (<$q_fh>) { my @fields = split; print if $keys{$fields[3]}; } close $q_fh; 运行。