Mam plik z jedną kolumną z nazwami, które powtarzają się kilka razy. Chcę zagęścić każde powtórzenie w jedno, zachowując wszystkie inne powtórzenia o tej samej nazwie, które nie sąsiadują z innymi powtórzeniami o tej samej nazwie.
Np. Chcę obrócić lewą stronę na prawą stronę:
Golgb1 Golgb1
Golgb1 Akna
Golgb1 Spata20
Golgb1 Golgb1
Golgb1 Akna
Akna
Akna
Akna
Spata20
Spata20
Spata20
Golgb1
Golgb1
Golgb1
Akna
Akna
Akna
Właśnie tego perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt
używałem : jednak ta metoda zachowuje tylko jednego przedstawiciela z lewej strony (tzn. Golb1 i Akna nie są powtarzane).
Czy istnieje sposób na zachowanie unikalnych nazw dla każdego bloku, przy jednoczesnym zachowaniu nazw powtarzających się w wielu, nie sąsiadujących blokach?
sort | uniq
sort -u
(:Awk
rozwiązanie:Wyjście:
źródło
Spróbuj tego - zapisz poprzednią linię i porównaj z bieżącą linią
Ty też oznaczyłeś tagiem
uniq
- próbowałeś?źródło
Z sed można to zrobić w następujący sposób:
Tutaj mamy w przestrzeni wzorów w dowolnym momencie 2 linie. Kiedy porównanie między nimi nie powiedzie się, drukujemy pierwszy, odcinamy go od przodu, cofamy i dołączamy następny wiersz do obszaru wzorów. Spłucz ... powtórz
Korzystając z Perla w trybie slurp, traktujemy cały plik jako jeden długi ciąg znaków, na którym zastosowano regex, który dokonuje porównania dla Ciebie.
źródło
Pytanie o sed rozwiązanie Rakesha Sharmy.
Co jeśli masz plik wejściowy, taki jak:
I chcesz, aby plik wyjściowy był:
Zwróć uwagę na brakujące:
Wiem, że polecenie, które chcę, jest podobne do twojego rozwiązania:
Nie można go zmienić we właściwy sposób, aby wydrukować obie kolumny i można go sortować tylko w ten specjalny sposób z wartościami kolumny 2. Jakieś wskazówki?
źródło
sed -e '$!N' -e '/.*\.\([0-9]*\)\n.*\.\1$/!{P;D;}' -e 's/\n.*//;s/^/\n/;D'
usunie kolejne powtarzające się elementy. Uwaga: Wymaga toGNU sed
. DoPOSIX
zachowania wymaga drobnych zmian.