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

У меня есть один файл 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

Как я могу сделать это без сортировки?

4
задан 22 August 2018 в 09:16

2 ответа

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

8
ответ дан 1 December 2019 в 09:06

Используя tac и uniq.

$ tac text.txt | uniq -w 16 | tac
0
ответ дан 1 December 2019 в 09:06

Другие вопросы по тегам:

Похожие вопросы: