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