Сортуйте та об’єднайте 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.