Ordina e unisci 2 file senza righe duplicate, in base alla prima colonna


12

Ho un file con tutti i nomi dei test:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

E un altro file contenente i nomi dei test e il risultato associato:

$ cat completed_tests.txt
test1 Passed
test3 Failed
test5 Passed
test6 Passed

Come creare un nuovo file contenente tutti i nomi dei test con il risultato associato senza duplicati?

Se eseguo:

sort all_tests.txt completed_tests.txt

L'output contiene duplicati:

test1 
test1 Passed
test2
test3 
test3 Failed
test4
test5 
test5 Passed
test6 
test6 Passed

L'output desiderato:

test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

Risposte:


17

Sembra che puoi ottenerlo joinmolto facilmente se i file sono entrambi ordinati.

$ join -a 1 all_test.txt completed_test.txt
test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

-a 1 indica le righe di stampa dal file 1 a cui non è stato aggiunto nulla.

Se i tuoi file non sono già ordinati, puoi usare questo (grazie terdon!):

join -a 1  <(sort all_tests.txt) <(sort completed_tests.txt )

7

Lo strumento giusto qui è joincome suggerito da @Zanna, ma ecco un awkapproccio:

$ 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

In effetti, questa è la risposta di un porto di 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

Funziona costruendo l'hash delle coppie test-status da completed_test.txte quindi cercando le righe in all_tests.txtquell'hash. La $tvariabile delle righe totali elaborate da ciascun file e $.che viene ripristinata al raggiungimento della fine del file, ci consente di tenere traccia di quale file è attualmente letto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.