我有一个如下的文本文件;
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
(第一列)至少重复一次,那么您可以:
- 颠倒行次序
- 只选择那些
$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
答案2
如果您能满足@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 }
答案3
Awk 是一个用于执行此类替换的程序。
要删除第一列中有重复的行,这样做就可以了。
awk '!seen[$1]++' filename > outputfile
如果您需要删除全部重复的行,请使用此项。
awk '!seen[$0]++' filename > outputfile
这里有一个简短的解释。awk 用于模式扫描和文本处理。首先,它检查第 1 列 ($1) 中的值是否在已看到的映射中。如果不在,它会将该行打印到输出文件,或者如果您不重定向 (> outputfile),则打印到屏幕上。下一部分是它将查看到的列信息添加到已看到的 (++),以便它可以使用下一个模式进行搜索。