Bash - Удалить дубликаты, чтобы сохранить порядок

У меня есть файл, который выглядит как

1254543534523233434
3453453454323233434
2342342343223233535
0909909092324243535

Есть ли способ / команда в bash для удаления дубликатов в файле выше, на основе определенной подстроки, без изменения их порядка в выходных данных?

т.е.

(С подстрокой -> ${строка:11:8}

1254543534523233434
2342342343223233535
0909909092324243535

Я знаю это:

sort -u : sorts them numerically, then removes duplicates
sort -kx,x -u : The same
cat filein | uniq : requires them to be sorted already or it will not work

Я пытаюсь выяснить, есть ли нативное решение для Linux без разрешения для Perl-кода для него. Заранее спасибо.

1 ответ

Решение

Вы можете использовать awk без необходимости сортировки:

awk '!uniq[substr($0, 12, 8)]++' file

1254543534523233434
2342342343223233535
0909909092324243535
  • Так как индекс awk начинается с 1 вам нужно использовать substr($0, 12, 8) чтобы получить желаемый текст длиной 8 символов, начиная с 12-й позиции.
  • uniq ассоциативный массив с подстрокой, полученной с помощью substr функция.
  • ++ устанавливает значение массива как 1
Другие вопросы по тегам