Linux 如何基于其他文件进行筛选

Linux 如何基于其他文件进行筛选,linux,text,file-io,Linux,Text,File Io,假设我有一个这种格式的文件 文件1: 和另一个文件2: c g e 我希望根据文件2筛选第二列并输出如下文件: rf c 3 df g 7 er e 4 linux命令将如何执行此操作?如果两个文件都已排序或顺序正确,则可以使用此命令。虽然这给出了不同的输出 join --nocheck-order -1 2 -2 1 file1.txt file2.txt 给予 c rf 3 g df 7 e er 4 使用perl,您可以读取密钥文件,然后检查每一行是否匹配 use strict;

假设我有一个这种格式的文件 文件1:

和另一个文件2:

c
g
e
我希望根据文件2筛选第二列并输出如下文件:

rf c 3
df g 7
er e 4
linux命令将如何执行此操作?

如果两个文件都已排序或顺序正确,则可以使用此命令。虽然这给出了不同的输出

join --nocheck-order -1 2 -2 1 file1.txt file2.txt
给予

c rf 3
g df 7
e er 4
使用perl,您可以读取密钥文件,然后检查每一行是否匹配

use strict;
use warnings;

my %keys;
open(my $f1, '<', 'file2.txt') or die("Cannot open file2.txt: $!");
while (<$f1>) {
    chomp;
    $keys{$_} = 1;
}

close($f1);

open(my $f2, '<', 'file1.txt') or die("Cannot open file1.txt: $!");
while (<$f2>) {
    my(undef, $col2, undef) = split(' ', $_);
    print if ($keys{$col2});
}

close($f2);

不一定快或漂亮,但关键在于:

cut -f 2 -d ' ' file1 | while read letter; do grep -n "$letter" file2 | cut -d ':' -f 1 | while read lineNo; do sed $((lineNo+1))'!d' file1; done; done;

好的编辑,Olaf=)现在更有意义了!啊,罗克斯!我仍然在学习新的东西——我从未见过NR==FNR{}构造来读取文件列表的第一个。这优雅地精确地解决了OP。
rf c 3
df g 7
er e 4
cut -f 2 -d ' ' file1 | while read letter; do grep -n "$letter" file2 | cut -d ':' -f 1 | while read lineNo; do sed $((lineNo+1))'!d' file1; done; done;
awk 'NR==FNR{A[$1];next}($2 in A)' file2 file1