Сортировка и объединение двух файлов без дубликатов строк, основанных на первом столбце

У меня есть файл со всеми именами тестов:

$ 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
12
задан 26 September 2017 в 22:52

8 ответов

Похоже, вы можете добиться этого с помощью 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 )
17
ответ дан 22 May 2018 в 21:35

Похоже, вы можете добиться этого с помощью 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 )
17
ответ дан 18 July 2018 в 11:44

Правильный инструмент здесь 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
7
ответ дан 22 May 2018 в 21:35

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

2
ответ дан 22 May 2018 в 21:35

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

2
ответ дан 18 July 2018 в 11:44

Правильный инструмент здесь 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
7
ответ дан 18 July 2018 в 11:44

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

2
ответ дан 24 July 2018 в 19:50

Правильный инструмент здесь 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
7
ответ дан 24 July 2018 в 19:50

Другие вопросы по тегам:

Похожие вопросы: