2015-06-05 10 views
5

Mam poniżej skrypt do łączenia dwóch plików.Linux awk łączy dwa pliki

awk -F"\t" ' 
    {key = $1} 
    !(key in result) {result[key] = $0; next;} 
    { for (i=2; i <= NF; i++) result[key] = result[key] FS $i } 
    END { 
     PROCINFO["sorted_in"] = "@ind_str_asc" # if using GNU awk 
     for (key in result) print result[key] 
    } 
' $1 $2 > $3 

Pierwsza kolumna jest kluczowa i zawiera od 1 do 2 USD. Ale jeśli kolumna 2 USD ma klucz, ale kolumna $ 1 nie ma klucza.

następnie również łączy się z wyjątkiem 1 $ wiersza.

Chcę połączyć tylko jeden klucz o wartości 1 USD. Jak mogę po prostu połączyć te dwa pliki?

Na przykład

Plik 1

Key Column1 Column2 Column3 
Test1 500  400  200    
Test2 499  400  200    
Test5 600  200  150    
Test6 600  199  150    
Test7 599  199  100    

File2

Key Column4 Column5 
Test1 Good  Good      
Test2 Good  Good 
Test3 Good  Good      
Test4 Good  Good 
Test5 Good  Good      
Test6 Good  Good 
Test7 Good  Good 

Aktualny Kombajny

Key Column1 Column2 Column3 Column4 Column5 
Test1 500  400  200  Good  Good  
Test2 499  400  200  Good  Good  
Test5 600  200  150  Good  Good   
Test6 600  199  150  Good  Good   
Test7 599  199  100  Good  Good 
Test3 Good Good 
Test4 Good Good 

Oczekiwany kombajnów.

Key Column1 Column2 Column3 Column4 Column5 
Test1 500  400  200  Good  Good  
Test2 499  400  200  Good  Good  
Test5 600  200  150  Good  Good   
Test6 600  199  150  Good  Good   
Test7 599  199  100  Good  Good 

Dziękujemy!

+0

Zdania 'Pierwsza kolumna jest klucz i oba 1 $ i 2 $. Ale jeśli kolumna 2 USD ma klucz, ale kolumna $ 1 nie ma klucza. to też łączy się z wyjątkiem 1 $ wiersza. "nic nie znaczę. Powinieneś je zmienić, aby odzwierciedlały, co masz na myśli, lub po prostu je usunąć. –

Odpowiedz

7

Będziesz o tym błędzie. Co opisujesz to operacja join i jest doskonale dobre narzędzie UNIX za to z bardzo oczywistego imię:

$ join file1 file2 | column -t 
Key Column1 Column2 Column3 Column4 Column5 
Test1 500  400  200  Good  Good 
Test2 499  400  200  Good  Good 
Test5 600  200  150  Good  Good 
Test6 600  199  150  Good  Good 
Test7 599  199  100  Good  Good 

lub jeśli nalegać na awk:

$ awk 'NR==FNR{m[$1]=$2" "$3; next} {print $0, m[$1]}' file2 file1 | column -t 
Key Column1 Column2 Column3 Column4 Column5 
Test1 500  400  200  Good  Good 
Test2 499  400  200  Good  Good 
Test5 600  200  150  Good  Good 
Test6 600  199  150  Good  Good 
Test7 599  199  100  Good  Good 
+0

Dziękuję, że to działa –

4

dodać warunek przy zapisywaniu do tablicy

{key = $1} 
!(key in result) && NR == FNR {result[key] = $0; next;} 
(key in result) { for (i=2; i <= NF; i++) { 
    result[key] = result[key] FS $i 
    } 
} 
END { 
    PROCINFO["sorted_in"] = "@ind_str_asc" # if using GNU awk 
    for (key in result) print result[key] 
} 

NR == FNR zapewnia, że ​​key przechowujemy w result wynosi od 1 pliku. Dodajemy także (key in result), aby upewnić się, że klucz istnieje przed iteracją przez pętlę for.

4

Można spróbować następujące polecenia:

awk ' 
    BEGIN { FS = OFS = "\t" } 
    {key = $1} 
    FNR == NR {result[key] = $0; next;} 
    (key in result) { for (i=2; i <= NF; i++) result[key] = result[key] FS $i } 
    END { 
     PROCINFO["sorted_in"] = "@ind_str_asc" # if using GNU awk 
     for (key in result) print result[key] 
    } 
' file1 file2 

Zmieniłem te kontrole. Tylko FNR == NR zapisuje w wierszach result z pierwszego pliku. I (key in result) dotyczy drugiego pliku i dołącza tylko kolumny dla kluczy znalezionych wcześniej w pierwszym pliku.

To daje:

Key  Column1 Column2 Column3   Column4 Column5 
Test1 500  400  200    Good Good 
Test2 499  400  200    Good Good 
Test5 600  200  150    Good Good 
Test6 600  199  150    Good Good 
Test7 599  199  100    Good Good 
+0

Dziękuję za odpowiedź, również to działa :) –