удаление последних повторяющихся строк в текстовых файлах

У меня есть текстовый файл следующим образом:

ALIC00AUS_R_20183350000.gz -4052052.7 4212835.9 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.7 4212836.0 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.7 4212836.0 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.7 4212835.9 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.5 4212836.0 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.6 4212835.9 -2545104.6
CPVG00CPV_R_20183460000.gz 5626883.4 -2380932.3 1824483.9
CPVG00CPV_R_20183460000.gz 5626883.4 -2380932.3 1824483.9
CPVG00CPV_R_20183460000.gz 5626883.3 -2380932.2 1824483.1

В этом файле ALIC00AUS_R_20183350000.gz и CPVG00CPV_R_20183460000.gz повторяются шесть и три раза соответственно. Мне нужно удалить последние повторяющиеся строки каждой строки в столбце 1, и результат должен быть следующим:

ALIC00AUS_R_20183350000.gz -4052052.7 4212835.9 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.7 4212836.0 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.7 4212836.0 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.7 4212835.9 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.5 4212836.0 -2545104.6
CPVG00CPV_R_20183460000.gz 5626883.4 -2380932.3 1824483.9
CPVG00CPV_R_20183460000.gz 5626883.4 -2380932.3 1824483.9
0
задан 24 April 2019 в 18:02

3 ответа

Если вы уверены , что каждый $1 (первый столбец) дублируется хотя бы один раз, то вы можете:

  1. изменить порядок строк
  2. [ 115] выбирают только те строки, чьи $1 были замечены до
  3. обратного результата

Пример.

$ tac file | awk 'seen[$1]++' | tac
ALIC00AUS_R_20183350000.gz -4052052.7 4212835.9 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.7 4212836.0 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.7 4212836.0 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.7 4212835.9 -2545104.6
ALIC00AUS_R_20183350000.gz -4052052.5 4212836.0 -2545104.6
CPVG00CPV_R_20183460000.gz 5626883.4 -2380932.3 1824483.9
CPVG00CPV_R_20183460000.gz 5626883.4 -2380932.3 1824483.9
0
ответ дан 24 April 2019 в 18:02

Если можно встретить гарантию в ответе, предоставленном @steeldriver, который является лучшим решением, если не используют этот сценарий.

##!/usr/bin/awk -f
{
  if (!seen[$1]++) {
    line = $0
    prev = $1
  }
  else {
    if (prev == $1) print line
    line = $0
  }
}
END { if (prev != $1) print line }
2
ответ дан 24 April 2019 в 18:02

Awk является движением к программе для того, чтобы сделать этот вид replacemen.

Удалить строки, которые имеют дубликат в первом столбце, это должно сделать это.

awk '!seen[$1]++' filename > outputfile

Если необходимо удалить полное дублирование использования строк это вместо этого.

awk '!seen[$0]++' filename > outputfile

Как замечено в этом ответе: https://unix.stackexchange.com/questions/171091/remove-lines-based-on-duplicates-within-one-column-without-sort

Вот краткое объяснение. awk используется для сканирования шаблона и обработки текста. Во-первых, это проверяет, находится ли значение в столбце 1 (1$) в замеченной карте. Если это не это, печатает строку к выходному файлу или экран, если Вы не перенаправляете (> outputfile). Следующая часть - то, что это добавляет просматриваемую информацию о столбце к замеченному (++), таким образом, это может искать со следующим шаблоном.

0
ответ дан 24 April 2019 в 18:02

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

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