最初の列に基づいて、重複する行のない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.txtall_tests.txt、そのハッシュ内の行を検索することで機能します。$t各ファイルから処理された合計行の変数は$.、ファイルの終わりに到達するとリセットされるため、現在読み取られているファイルを追跡できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.