我有一个包含所有测试名称的文件:
$ 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
$.