첫 번째 열을 기준으로 중복 행없이 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에서 아무 행도 연결하지 않은 인쇄 행을 의미합니다.

파일이 아직 정렬되지 않은 경우 이것을 사용할 수 있습니다 (터든 덕분에!).

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

실제로 이것은 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각 파일에서 처리 된 총 라인의 변수와 $.파일의 끝 부분에 도달하면 즉 리셋, 우리가 현재 읽고있는 된 파일을 추적 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.