我有三个文件,,file1.txt
它们具有相同的格式(具有相同数据类型的相同列数)。file2.txt
file3.txt
我想通过将第 2 列、第 3 列分别与输出文件 进行比较来选择file1.txt
中不存在的记录file2.txt
。你能帮我怎么做吗?file3.txt
out.txt
输入示例:
file1.txt
abc 1 a f11 f13 f14
abd 2 b f12 f14 f13
abe 4 d f13 f16 f12
acf 6 s f14 f15 f19
file2.txt
abc 1 a f21 f23 f24
abd 1 b f21 f24 f23
abe 4 d f24 f26 f22
acf 6 s f23 f25 f29
file3.txt
abc 1 a f31 f33 f34
abd 3 b f31 f34 f33
acf 6 s f33 f35 f39
abe 3 d f34 f36 f32
所需输出
out.txt
abd 2 b f12 f14 f13
除了这一行之外,其他行都存在于file2.txt
,file3.txt
答案1
如果你这么喜欢awk
awk '
FILENAME != ARGV[3] {
m[$2,$3] = 1
next
}
!(($2,$3) in m)
' file3.txt file2.txt file1.txt > out.txt
对我来说很容易
cut -d" " -f 2,3 file2.txt file3.txt | grep -v -f - file1.txt > out.txt
答案2
可能的解决方案awk
:
awk 'FILENAME == ARGV[1] {
m[$2,$3] = $0;
next;
}
FILENAME == ARGV[2] {
if (!(($2,$3) in m)) {
m[$2,$3] = $0;
}
next;
}
{
if (!(($2,$3) in m)) {
print $0 >"out.txt";
}
}' file3.txt file2.txt file1.txt
首先,我们读取第一个文件并创建包含第 2 列和第 3 列键的数组。
然后,我们读取第二个文件并检查第 2 列和第 3 列中的键是否存在于第一个数组中,如果不存在,我们将其添加到数组中。
最后,我们读取第一个文件,检查数组中是否存在键,如果不存在,那就是我们感兴趣的行。
输出.txt第一个文件中应包含其他两个文件中未出现的行:
abd 2 b f12 f14 f13