Как я могу найти дубликаты в первом столбце, а затем удалить относительно целых строк?
У меня есть один файл 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
Как я могу сделать это без сортировки?
1 ответ
Чтобы удалить дубликаты на основе одного столбца, вы можете использовать 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
, мы делаем это снова для последней строки.