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


12

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

$ 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

Answers:


17

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 )

7

正确的工具是@Zanna join建议的,但这是一种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

2

佩尔

实际上,这是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从每个文件处理的总行数$.,并在到达文件末尾时重置,该变量使我们能够跟踪当前正在读取哪个文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.