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