すべてのテスト名を含むファイルがあります:
$ 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 )
ここでの正しいツールは、@ Zannaによる 推奨 としてのjoin
ですが、これは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
変数と、ファイルの終わりに達するとリセットされる$.
により、現在読み取られているファイルを追跡できます。