Что сделал `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 уник не имеют смысла. Почему они не могут использовать тот же синтаксис, что и sort.
Стефан Шазелас

Ответы:


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, так как пропускается только первое поле. Для работы последней строки требуется по крайней мере одна двоеточие (надеюсь, не первая). Тем не менее, нет никакой гарантии, что он будет работать (любое из первых полей может содержать пробелы)
Грэм,

@ Хорошая идея, отредактировано.
Кейси

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

4

Учитывая manзапись для -fопции:

-f, --skip-fields = N

         avoid comparing the first N fields

Я думаю, что вполне безопасно предположить, что -tопределяет разделитель полей (это также имеет место sortв приведенной выше строке). Комбинация двух опций заставит uniqработать только на той части строки, которая следует за первым двоеточием.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.