У меня есть один файл xlsx (матрица 110725x9), и я сохранил его в виде текста (вкладка удалена), потому что я не знаю, помогает ли Unix для файлов xlsx или нет. Дубликаты строк всегда последовательны построчно.
Например, предположим, текстовый файл следующим образом. Вы увидите, что 3,4-й, 7,8-й и 17,18-й ряды одинаковы. Я хотел бы удалить верхние повторяющиеся строки не всегда ниже.
2009,37214611872 2009 135 20 17,1 17,4 19,2 21,8 24,1
2009,37237442922 2009 135 22 16,5 14,5 12,6 11,2 10,5
2009,37260273973 2009 136 0 7,7 7,2 7,1 7,3 7,5
2009,37260273973 2009 136 0 7,7 7,2 7,0 7,2 7,4
2009,37488584475 2009 136 20 14,6 15,1 16,4 18,3 20,1
2009,37511415525 2009 136 22 15,9 14,6 12,8 10,9 9,4
2009,37534246575 2009 137 0 8,2 6,9 6,2 6,2 6,4
2009,37534246575 2009 137 0 8,1 6,8 6,1 6,0 6,3
2009,37557077626 2009 137 2 6,8 6,7 6,5 6,3 6,2
2009,37579908676 2009 137 4 5,8 5,6 5,4 5,4 5,7
2009,37602739726 2009 137 6 6,3 6,1 5,9 5,8 5,8
2009,37625570776 2009 137 8 4,5 5,2 6,0 6,6 7,2
2009,37648401826 2009 137 10 9,6 9,0 8,4 8,4 9,1
2009,37671232877 2009 137 12 11,4 11,7 12,4 13,4 14,4
2009,37694063927 2009 137 14 12,4 13,1 14,2 15,4 16,7
2009,37785388128 2009 137 22 15,5 14,0 12,2 10,3 8,7
2009,37808219178 2009 138 0 6,3 5,8 5,5 5,5 5,8
2009,37808219178 2009 138 0 6,2 5,7 5, 4 5,4 5,7
Таким образом, выходные данные должны быть такими:
2009,37214611872 2009 135 20 17,1 17,4 19,2 21,8 24,1
2009,37237442922 2009 135 22 16,5 14,5 12,6 11,2 10,5
2009,37260273973 2009 136 0 7,7 7,2 7,0 7,2 7,4
2009,37488584475 2009 136 20 14,6 15,1 16,4 18,3 20,1
2009,37511415525 2009 136 22 15,9 14,6 12,8 10,9 9,4
2009,37534246575 2009 137 0 8,1 6,8 6,1 6,0 6,3
2009,37557077626 2009 137 2 6,8 6,7 6,5 6,3 6,2
2009,37579908676 2009 137 4 5,8 5,6 5,4 5,4 5,7
2009,37602739726 2009 137 6 6,3 6,1 5,9 5,8 5,8
2009,37625570776 2009 137 8 4,5 5,2 6,0 6,6 7,2
2009,37648401826 2009 137 10 9,6 9,0 8,4 8,4 9,1
2009,37671232877 2009 137 12 11,4 11,7 12,4 13,4 14,4
2009,37694063927 2009 137 14 12,4 13,1 14,2 15,4 16,7
2009,37785388128 2009 137 22 15,5 14,0 12,2 10,3 8,7
2009,37808219178 2009 138 0 6,2 5,7 5, 4 5,4 5,7
Как я могу сделать это без сортировки?
Для удаления дубликатов на основе отдельного столбца можно использовать awk
:
awk '!seen[$1]++' input-file > output-file
Вы видите объяснение этого в этом сообщении Unix & Linux.
Удаление более старых строк более сложно. Учитывая, что дубликаты всегда объединяются, можно сделать:
awk 'prev && ($1 != prev) {print seen[prev]} {seen[$1] = $0; prev = $1} END {print seen[$1]}' input-file > output-file
Здесь, в среднем блоке, {seen[$1] = $0}
сохраняет текущую строку ($0
) к seen
массив с первым полем ($1
) как индекс, затем сохраняет первое поле в prev
переменная. Это prev
используется в первом блоке при обработке следующей строки.
В первом блоке, затем, мы проверяем если prev
установлен (только верный для второй строки вперед) и не равный текущему первому полю (здесь prev
был установлен при обработке предыдущей строки). Если это не, мы переместили прошлые дубликаты и можем распечатать предыдущую строку. В END
, мы делаем это снова для последней строки.
Используя tac и uniq.
$ tac text.txt | uniq -w 16 | tac