Unix как фильтровать текстовый файл, чтобы найти дубликаты в части строки от 1 до 49 символов и сохранить только один

#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