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

时间:2009-10-19 16:35:31

标签: 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,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

但它没有按预期工作,因为它也删除了非重复的行。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

作为一般策略(尽管我和Aho一起上课,但我不是一个AWK专业人士)你可能会尝试:

  1. 连接除了以外的所有字段 最后一个。
  2. 使用此字符串作为哈希的键。
  3. 将整行存储为值 哈希。
  4. 处理完所有行后, 循环打印哈希 价值观。
  5. 这不是AWK特定的,我不能轻易提供任何示例代码,但这是我首先尝试的。

答案 2 :(得分:1)

如果您的近似重复项始终相邻,则可以与上一个条目进行比较,避免创建可能很大的关联数组。

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

修改:更改了脚本,以便在一组近似重复项中打印最后一个脚本(不需要tac)。