删除文本文件中最后重复的行

删除文本文件中最后重复的行

我有一个如下的文本文件;

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.gzCPVG00CPV_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. 颠倒行次序
  2. 只选择那些$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

答案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

正如在这个答案中看到的:https://unix.stackexchange.com/questions/171091/remove-lines-based-on-duplicates-within-one-column-without-sort

这里有一个简短的解释。awk 用于模式扫描和文本处理。首先,它检查第 1 列 ($1) 中的值是否在已看到的映射中。如果不在,它会将该行打印到输出文件,或者如果您不重定向 (> outputfile),则打印到屏幕上。下一部分是它将查看到的列信息添加到已看到的 (++),以便它可以使用下一个模式进行搜索。

相关内容