Що зробив `uniq -t`?


15

У мене є старий код з 2003 року, який використовує -tпараметр для uniqкоманди. Він видає помилку, оскільки ця опція, ймовірно, більше не підтримується.

Ось фрагмент, який використовує команду:

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

Що тоді зробив цей варіант? З чим я можу замінити цю команду?



Відповідно man uniq, -f 1уникає порівняння першого поля. Я б сказав, що з -t ':'цього -tпередбачається змінити полевий сепаратор з пробілів на :.
Мартін фон Віттіч

Можливо, релевантно: stackoverflow.com/questions/10546337/… Можливо, -tбув певний Debian варіант, який пізніше було видалено?
Мартін фон Віттіч


1
Мені завжди було цікаво, чому uniqвін не мав однакового -tі -kяк сортування або чому сорт не мав усіх uniqвбудованих функцій (оскільки він має зараз -u). Ті -w/ -f/ -sвід GNU uniq не мають сенсу. Чому вони не могли використовувати той самий синтаксис, що і sort.
Stéphane Chazelas

Відповіді:


13

Єдина посилання, яку я міг знайти, -t- це патч у списку розсилки GNU, який містить серед інших підказки, це:

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

Це, мабуть, було розширенням GNU, але більше не використовується. Схоже, це дозволяє вибирати обмежувальний символ для полів, відмінних від пробілів чи вкладок. Спробуйте замінити

uniq -t ':' -f 1 | \

з

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

який замінить :пробіли, які uniq розпізнає роздільник поля.


Я б відмовився gвід sed, оскільки пропускається лише перше поле. Принаймні одна двокрапка потрібна для роботи останнього рядка (сподіваємось, не першого). Все ще немає гарантії, що вона буде працювати, хоча (будь-яке з перших полів може містити пробіл)
Graeme

@Graeme Добрий момент, відредаговано.
casey

У Debian, coreutils 5.2.1 дійсно був застосований такий патч, і, мабуть, він був видалений у 5.93-1, тобто у листопаді 2005 року.
user2719058

4

Враховуючи manзапис для -fопції:

-f, --skip-поля = N

         avoid comparing the first N fields

Я думаю, що це досить безпечно припустити -t вказується роздільник поля (це також має місце sortу рядку вище). Поєднання двох варіантів змусить би uniqдіяти лише на частині лінії, що слідує за першою двокрапкою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.