2013-01-09 11 views
6

Mam dwóch plików plik1 oraz plik2Łączenie dwóch plików w Linuksie bez powtórzeń

Zawartość plik1 jest

Hello 
    how 
are you 
when can i meet you 
film?? 

Zawartość plik2 jest

Hello 
how 
are you 
darling 
when can i meet you 

Chcę, aby wygenerować plik, który to połączenie dwóch plików, takich jak

Hello 
how 
are you 
darling 
when can i meet you 
film?? 

Uwaga: W drugim wierszu pliku należy pominąć miejsce w ostatecznym pliku Czy istnieje jakaś wbudowana funkcja w C lub Linux, aby wykonać powyższe zadanie lub czy można napisać skrypt, aby to zrobić?

+0

Jeśli taka funkcja istnieje, z pewnością nigdy jej nie widziałem. Najprawdopodobniej będziesz musiał napisać samemu. – WhozCraig

+1

Możesz użyć 'fgets' = przeczytać linie i' strcmp' = porównać ciąg. –

+0

Jeśli nie chcesz używać niektórych poleceń pod linuxem, możesz stworzyć prosty program w C, który może wykonać to zadanie. – user1929959

Odpowiedz

1

Oto jeden ze sposobów korzystania awk:

awk '{ gsub(/^[ \t]+|[ \t]+$/,"") } !a[$0]++' file2 file1 

Wyniki:

Hello 
how 
are you 
darling 
when can i meet you 
film?? 

EDIT:

Problem:

awk '{ $1=$1 } !a[$0]++' file2 file1 

jest to, że mimo że działa dobrze na tym prostym przykładzie, będzie to traktować w podobny sposób jak to samo, ponieważ nie tylko usuwa spacje wiodące i tyle, ale będzie to także usunąć dodatkowe spacje między dziedzinach.Na przykład, jeśli file1 zawiera:

Hello 
    how 
are you 
when can i meet you 
film?? 

zarówno:

when can i meet you 

i:

when can i meet you 

linie będą traktowane jako to samo. Może to być pożądany wynik, ale w oparciu o twoje pytanie, myślę, że najlepiej jest po prostu usunąć początkowe i opóźniające białe znaki, jak przy pierwszym poleceniu. HTH.

4

łatwe zadanie dla awk:

$ awk '{$1=$1}!u[$0]++' file2 file1 
Hello 
how 
are you 
darling 
when can i meet you 
film?? 

Lub jeśli nie dbają o porządek na wyjściu:

$ sed 's/^\s*//' file1 file2 | sort -u 
are you 
darling 
film?? 
Hello 
how 
when can i meet you 
+0

"czy jesteś", "czy mogę się spotkać, czy mogę cię spotkać" na wyjściu? – Kent

+0

Cholera, 'join' prawie zrobił lewę, zmieniono rozwiązanie" awk ". –

+0

Czy linia awk naprawdę daje ten wynik? Myślę, że przetworzy i wydrukuje wszystkie linie pliku1, a następnie pliku2. więc zamówienie nie zostało dotrzymane. Jeśli podasz parametr plik2 plik1, to da to ouput. jednak jeśli pliki wejściowe zostały nieznacznie zmienione, kolejność może być błędna. Osobiście uważam, że reguła nie została jasno zdefiniowana, gdy dwie linie z dwóch plików są różne, więc trudno jest podać precyzyjne rozwiązanie. – Kent

0

można zastosować kilka filtrów standard:

cat file1 file2 | perl -pe 's/^\s+//' | sort | uniq 
  • cat służy do łączenia wszystkie wymagane pliki,
  • perl jest Notuje usunąć wszystkie początkowe whote przestrzeń,
  • sort sortuje wszystkie linie,
  • i uniq usuwa zduplikowane wiersze.
+0

Wątpię, czy sort da oczekiwany wynik .. – Kent

+0

@Kent: Wydawało mi się, że nie ma żadnych ograniczeń co do kolejności linii na wyjściu , ale zadanie nie było dobrze określone. – anumi

+0

@anumi wynik został określony przez OP. –