根据第一列对 2 个没有重复行的文件进行排序并合并

根据第一列对 2 个没有重复行的文件进行排序并合并

我有一个包含所有测试名称的文件:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

另一个文件包含测试名称和相关结果:

$ cat completed_tests.txt
test1 Passed
test3 Failed
test5 Passed
test6 Passed

如何创建一个包含所有测试名称及其相关结果且无重复的新文件?

如果我执行:

sort all_tests.txt completed_tests.txt

输出包含重复项:

test1 
test1 Passed
test2
test3 
test3 Failed
test4
test5 
test5 Passed
test6 
test6 Passed

期望的输出:

test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

答案1

join如果两个文件都已排序,那么似乎可以非常轻松地实现这一点。

$ join -a 1 all_test.txt completed_test.txt
test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

-a 1表示打印文件 1 中没有任何连接的行。

如果您的文件尚未排序,您可以使用这个(感谢 terdon!):

join -a 1  <(sort all_tests.txt) <(sort completed_tests.txt )

答案2

正确的工具如下join建议由@Zanna 提供,但这里有一种awk方法:

$ awk 'NR==FNR{a[$1]=$2; next}{print $1,a[$1]}' completed_tests.txt all_tests.txt 
test1 Passed
test2 
test3 Failed
test4 
test5 Passed
test6 Passed

答案3

Perl

实际上,这是 terdon 答案的一个移植版本:

$ perl -lane '$t+=1; $h{$F[0]}=$F[1] if $.==$t; print $F[0]," ",$h{$F[0]} if $t!=$.;$.=0 if eof' completed_tests.txt all_tests.txt          
test1 Passed
test2 
test3 Failed
test4 
test5 Passed
test6 Passed

它的工作原理是构建测试状态对的哈希,然后在该哈希中completed_test.txt查找行。每个文件处理的总行数变量在到达文件末尾时重置,这使我们能够跟踪当前正在读取哪个文件。all_tests.txt$t$.

相关内容