Linux 如何基于其他文件进行筛选
假设我有一个这种格式的文件 文件1: 和另一个文件2: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;
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