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

Ben*_*nny 13 command-line bash text-processing

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

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6
Run Code Online (Sandbox Code Playgroud)

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

$ cat completed_tests.txt
test1 Passed
test3 Failed
test5 Passed
test6 Passed
Run Code Online (Sandbox Code Playgroud)

如何创建一个包含所有测试名称和相关结果的新文件而没有重复?

如果我执行:

sort all_tests.txt completed_tests.txt
Run Code Online (Sandbox Code Playgroud)

输出包含重复项:

test1 
test1 Passed
test2
test3 
test3 Failed
test4
test5 
test5 Passed
test6 
test6 Passed
Run Code Online (Sandbox Code Playgroud)

所需的输出:

test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed
Run Code Online (Sandbox Code Playgroud)

Zan*_*nna 18

join如果文件都已排序,您似乎可以很容易地实现这一点。

$ join -a 1 all_test.txt completed_test.txt
test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed
Run Code Online (Sandbox Code Playgroud)

-a 1 表示从文件 1 打印没有任何内容的行。

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

join -a 1  <(sort all_tests.txt) <(sort completed_tests.txt )
Run Code Online (Sandbox Code Playgroud)


ter*_*don 7

这里的正确工具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
Run Code Online (Sandbox Code Playgroud)