Сортировка и объединение 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

Ответы:


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

Правильный инструмент здесь такой, 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

2

Perl

Фактически, это ответ порта Тердона:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.