Mam taki ciąg
"aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc"
Chcę usunąć zduplikowane słowo z ciągu, a następnie wynik będzie podobny
"aaa,bbb,ccc"
Próbowałem tego kodu źródłowego
$ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs
Działa dobrze z tą samą wartością, ale kiedy podam moją wartość zmiennej, pokazuje także wszystkie zduplikowane słowa.
Jak mogę usunąć zduplikowaną wartość.
AKTUALIZACJA
Moje pytanie polega na dodaniu całej odpowiadającej wartości do jednego ciągu, jeśli użytkownik jest taki sam. Mam takie dane ->
user name | colour
AAA | red
AAA | black
BBB | red
BBB | blue
AAA | blue
AAA | red
CCC | red
CCC | red
AAA | green
AAA | red
AAA | black
BBB | red
BBB | blue
AAA | blue
AAA | red
CCC | red
CCC | red
AAA | green
W kodowaniu pobieram wszystkich różnych użytkowników, a następnie z powodzeniem łączę ciąg kolorów. Dla tego, że używam kodu -
while read the records
if [ "$c" == "" ]; then #$c I defined global
c="$colour1"
else
c="$c,$colour1"
fi
Kiedy drukuję tę zmienną $ c, otrzymuję wynik (dla użytkownika AAA)
"red,black,blue,red,green,red,black,blue,red,green,"
Chcę usunąć zduplikowany kolor. Następnie pożądane wyjście powinno być jak
"red,black,blue,green"
Do tego pożądanego wyjścia użyłem powyższego kodu
echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs
ale wyświetla dane wyjściowe ze zduplikowanymi wartościami
„czerwony, czarny, niebieski, czerwony, zielony, czerwony, czarny, niebieski, czerwony, zielony”, Dzięki
źródło
echo 'aaa aaa aaa bbb bbb ccc bbb ccc' | xargs -n1 | sort -u | xargs
dajeaaa bbb ccc
.. więc musisz pokazać dokładny kod, który zmęczyłeś is='aaa aaa aaa bbb bbb ccc bbb ccc'; echo "$s" | xargs -n1 | sort -u | xargs
Odpowiedzi:
Jeszcze jeden awk, dla zabawy:
Nawiasem mówiąc, nawet twoje rozwiązanie działa dobrze ze zmiennymi:
źródło
%s
zamiast%s%s
. Powodem jest to, że robiłem pętlę for przez wyniki, a dwie białe spacje powodowały pewne wyzwania z dopasowaniami regularnymi.Z
tr
,sort
iuniq
lub
dostać jedną linię
źródło
| xargs
aby ponownie dołączyć dane wyjściowe do jednej liniisort -u
. Lub nawetawk '!u[$0]++
.sort -u
. Używam przezsort | uniq
cały ten czas. Zmarnowane naciśnięcia klawiszy ...źródło
Z GNU
sed
:Możesz dodać,
;s/ */ /g
aby usunąć zdublowane spacje.Funkcje takie jak to: Jeśli słowo jest po raz drugi w tym wierszu, usuń je i zacznij od nowa, aż nie będzie już żadnej publikacji.
źródło
\<
i\>
?źródło
Obowiązkowe rozwiązanie awk:
(Finał
echo
jest dostępny dla nowej linii)źródło
sort
Rozwiązanie nie zachować oryginalną kolejność albo, choć.awk -vRS=" " -vORS=" " '!a[$1]++ {print $1}' ; echo
To zachowuje zamówienie.Pyton
opcja 1
Ustaw plik wykonywalny, a następnie zadzwoń z Bash:
Możesz też zaimplementować go jako funkcję Bash, ale składnia jest nieporządna.
Opcja 2
W razie potrzeby ta opcja może stać się jednostronną:
W Bash:
źródło
źródło
awk
zastosowanej implementacji (asorti()
nie jest toawk
funkcja standardowa ).Korzystanie z oryginalnych danych tabelarycznych w pliku o nazwie
file
:To generuje
Trzy etapy rurociągu:
sed
Polecenie usuwa pierwszą linię, która jest nagłówek, że nie chcemy czytać.sort
Komenda daje nam unikalne linie. Przykładowe dane posort
wyglądzieawk
Komenda bierze te dane i tworzy ciąg oddzielonych przecinkami dla każdego użytkownika w tablicycolor
(gdzie nazwa użytkownika jest kluczem do tablicy). Na końcu (wEND
bloku) wszystkie zebrane dane są wyprowadzane.źródło
źródło