У меня есть файл со всем тестовым именем:
$ 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
Похоже, что вы можете добиться этого с помощью 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 )
Правильный инструмент здесь 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
Эффективно, это - порт ответа 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
переменная общих строк обрабатывается из каждого файла и $.
это сбрасывается на достигающий конец файла, позвольте нам отслеживать, которых в настоящее время читается файл.