Как я могу найти дубликаты в первом столбце, а затем удалить относительно целых строк?

У меня есть один файл 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, мы делаем это снова для последней строки.

Использование tac и uniq.

$ tac text.txt | uniq -w 16 | tac
Другие вопросы по тегам