У меня есть текстовый файл следующим образом:
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
Если вы уверены , что каждый $1
(первый столбец) дублируется хотя бы один раз, то вы можете:
$1
были замечены до Пример.
$ 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
Если можно встретить гарантию в ответе, предоставленном @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 }
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). Следующая часть - то, что это добавляет просматриваемую информацию о столбце к замеченному (++), таким образом, это может искать со следующим шаблоном.