#shell #sorting #unix #duplicates
#оболочка #сортировка #unix #дубликаты
Вопрос:
Мне приходится фильтровать много строк данных и находить дубликаты в позиции 1-49 символов. Следующий первый дубликат остается там, а остальные дубликаты удаляются. Сценарий должен быть в сценарии оболочки. Я читал о sort, uniq, но не смог найти правильный пример.
Дублированные строки от 1 до 49 символов должны быть удалены и сохранены только в первую очередь. В примере строка: ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z24 дублируется 4 раза и сохраняется только сначала из строки 1.
У меня есть этот пример строк:
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z241
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z215
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z225
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z235
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z242
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z244
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z245
Вывод должен быть:
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z241
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z215
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z225
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z235
Комментарии:
1. Вы могли бы выполнить 2-шаговый процесс, в котором вы разделяете первые 49 символов в ilne и сохраняете его в файле вместе с исходной строкой. Тогда вы могли бы использовать только столбцы uniq
uniq
. Может быть медленным для большого количества строк. Сколько строк у вас есть?
Ответ №1:
Если вы не возражаете, чтобы ваши данные сначала сортировались, sort
awk
можно использовать комбинацию и . Из группы совпадающих строк после сортировки данных будет выведена первая строка, которая не обязательно является первой строкой в исходном файле.
sort inputfile |awk 'BEGIN { last = ""; }
{ pattern = substr($0,1,48); if(pattern != last) print; last = pattern; }'
Примечание: раньше я substr($0,1,48)
получал 48 символов, потому что в вашем примере я насчитал только 48 жирных символов.
С помощью ввода
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z241
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z215
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z225
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z235
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z242
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z244
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z245
Я получаю результат
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z215
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z225
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z235
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z241