我想比较具有不同列和行号的两个大文件,并打印那些具有常用词的行(如KJ
):
文件1:
XT1 123 aa NR
XT2 444 bb GF
XT3 666 aa KJ
file2的
fc KK pcn
wd CC KJ
输出
XT3 666 aa wd CC KJ
我试过但我没有得到任何东西:
awk 'FNR==NR{a[$4]=$3;next}{if (a[$3])print a[$3],$0}' file1 file2
提前感谢您的帮助
答案 0 :(得分:2)
根据您提供的有限信息,
my $file1 = '...';
my $file2 = '...';
my %file2;
{
open(my $fh2, '<', $file2)
or die("Can't open \"$file2\": $!\n');
while (<$fh2>) {
my @F = split;
$file2{$F[2]} = join(' ', @F[0,1]);
}
}
{
open(my $fh1, '<', $file1)
or die("Can't open \"$file1\": $!\n');
while (<$fh1>) {
my @F = split;
print(join(' ', @F[0..2], $file2{$F[3]}, $F[3]), "\n")
if $file2{$F[3]};
}
}
我假设了以下内容:
file2
在内存中作为行的哈希值。file2
中不会出现两次。file1
的第4列与file2
的第3列匹配。它维护file1
中显示的行的顺序。
答案 1 :(得分:2)
你很亲密,试试这个:
awk 'FNR==NR { a[$4]=$1 FS $2 FS $3; next } $3 in a { print a[$3], $0 }' file1 file2
结果:
XT3 666 aa wd CC KJ
快速解释:
在'file1'中,将第4列添加到第1,2和3列作为值的数组中。
在'file2'中,检查第3列是否在数组中,如果是,则打印出它的值和当前行。
答案 2 :(得分:0)
我会为每个文件的行号创建一个单独的单词哈希值, 以及为每个文件存储每行的数组。
然后我会迭代文件1中的单词列表,并在文件2中查找匹配项。 如果我找到匹配项,那么我会在两个文件中查找该单词的行号。 使用行号,我将从数组中检索“行”,并返回唯一单词列表。