Unix 如何使用AWK删除部分重复行?

Unix 如何使用AWK删除部分重复行?,unix,awk,duplicate-data,lines,Unix,Awk,Duplicate Data,Lines,我有这样的重复行文件,其中只有最后一个字段不同: OST,0202000070,01-AUG-09,002735,6,0,0202000068,4520688,-1,0,0,0,0,0,55 ONE,0208076826,01-AUG-09,002332,316,3481.055935,0204330827,29150,200,0,0,0,0,0,5 ONE,0208076826,01-AUG-09,002332,316,3481.055935,0204330827,29150,200,0,0,

我有这样的重复行文件,其中只有最后一个字段不同:

OST,0202000070,01-AUG-09,002735,6,0,0202000068,4520688,-1,0,0,0,0,0,55
ONE,0208076826,01-AUG-09,002332,316,3481.055935,0204330827,29150,200,0,0,0,0,0,5
ONE,0208076826,01-AUG-09,002332,316,3481.055935,0204330827,29150,200,0,0,0,0,0,55
OST,0202000068,01-AUG-09,003019,6,0,0202000071,4520690,-1,0,0,0,0,0,55
我需要删除行的第一个匹配项,保留第二个

我试过:

awk '!x[$0]++ {getline; print $0}' file.csv
但它并没有达到预期的效果,因为它还删除了不重复的行。

作为一种一般策略(尽管与Aho一起上课,但我不是AWK专业人士),您可以尝试:

  • 连接除 最后一个
  • 将此字符串用作哈希的键
  • 将整行存储为值 简直糟透了
  • 处理完所有行后, 循环通过散列打印输出 价值观

  • 这不是特定于AWK的,我也不能轻易地提供任何示例代码,但这是我第一次尝试的

    如果您的近重复项总是相邻的,您可以只与上一个条目进行比较,避免创建一个潜在的巨大关联数组

    #!/bin/awk -f
    {
        s = substr($0, 0, match($0, /,[^,]+$/))
        if (!seen[s]) {
            print $0
            seen[s] = 1
        }
    }
    
    #!/bin/awk -f
    {
        s = substr($0, 0, match($0, /,[^,]*$/))
        if (s != prev) {
            print prev0
        }
        prev = s
        prev0 = $0
    } 
    END {
        print $0
    }
    

    编辑:更改脚本,使其打印一组近似副本中的最后一个(无需
    tac

    此脚本需要在右方括号后加一个星号以匹配正确的子字符串。除此之外,它与
    awk'完全相同!x[substr($0,1,16)]++'file.csv
    。他们都会因为打印一组近乎重复的数据中的第一个而受苦,而不是最后一个。相同的wrt此训练数据,这需要更正,并且很好地满足OP的要求。您可以通过在调用
    tac
    之间夹在中间,例如
    tac | script.awk file.txt | tac
    来“正确”完成此工作。当然,如果你够幸运有tac的话。:)我的意思是
    tac | script.awk | tac file.txt
    您的(近)副本总是相邻的还是可以散布的?它们总是相邻的,因为它们已经是另一个awk操作的结果。