Co zrobił `uniq -t`?


15

Mam trochę starego kodu z 2003 roku, który używa -topcji uniqpolecenia. Zgłasza błąd, ponieważ ta opcja prawdopodobnie nie jest już obsługiwana.

Oto element, który używa polecenia:

egrep -n "{ IA32_OP" ia32-decode.c | \
    awk '{ print $1 $3 $4 }' | \
    sort -t '(' +1 | \
    uniq -t ':' -f 1 | \
    sed 's/\(.*\)\:IA32_OP(\(.*\)),/#define IA32_OP_\2 \1/g' >> ia32_opcodes.h

Co wtedy zrobiła ta opcja? Czym mogę zastąpić to polecenie?



Według man uniq, -f 1unika porównywania pierwszego pola. Wnioskuję z -t ':'tego, że -tma on zmienić separator pola z pustych pól na :.
Martin von Wittich

Być może istotne: stackoverflow.com/questions/10546337/... Może być może -topcja specyficzna dla Debiana została później usunięta?
Martin von Wittich


1
Zawsze zastanawiałem się, dlaczego uniqnie ma tego samego -ti -kjako sortowania lub dlaczego sort nie ma wszystkich uniqwbudowanych funkcji (ponieważ teraz ma -u). Te -w/ -f/ -sz GNU uniq nie mają sensu. Dlaczego nie mogli użyć tej samej składni co sort.
Stéphane Chazelas

Odpowiedzi:


13

Jedyne odniesienie, które mogłem znaleźć, -tznajduje się w tej łatce na liście mailingowej GNU, która zawiera między innymi następujące wskazówki:

+  -t, --separator=S     use a character in string S as field separator\n\

To najwyraźniej było rozszerzenie GNU, ale już nie jest używane. Wydaje się, że pozwala wybrać znak oddzielający dla pól innych niż spacje lub tabulatory. Spróbuj wymienić

uniq -t ':' -f 1 | \

z

sed 's/:/ /' | \
uniq -f 1 | \

które zostaną zastąpione :spacjami, które uniq rozpoznaje separator pól.


Zrzuciłbym gz sed, ponieważ tylko pierwsze pole jest pomijane. Do działania ostatniego wiersza potrzebny jest co najmniej jeden dwukropek (mam nadzieję, że nie pierwszy). Nadal nie ma gwarancji, że zadziała (każde z pierwszych pól może zawierać spacje)
Graeme

@Graeme Good point, edytowany.
Casey

W Debianie Coreutils 5.2.1 rzeczywiście zastosowało taką łatkę i najwyraźniej została usunięta w 5.93-1, czyli w listopadzie 2005 r.
2719058

4

Biorąc pod uwagę manwpis dla -fopcji:

-f, --skip-fields = N

         avoid comparing the first N fields

Myślę, że dość bezpiecznie jest założyć, że -tokreśla on separator pól (tak też jest sortw powyższym wierszu). Kombinacja dwóch opcji sprawiłaby, że uniqdziałałaby tylko na części linii następującej po pierwszym dwukropku.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.