2

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

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

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

4

3 回答 3

2
#!/bin/awk -f
{
    s = substr($0, 0, match($0, /,[^,]+$/))
    if (!seen[s]) {
        print $0
        seen[s] = 1
    }
}
于 2009-10-19T17:19:40.223 回答
1

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

  1. 连接除最后一个以外的所有字段。
  2. 将此字符串用作散列的键。
  3. 将整行作为值存储到哈希中。
  4. 处理完所有行后,循环通过哈希打印出值。

这不是 AWK 特定的,我不能轻易提供任何示例代码,但这是我首先尝试的。

于 2009-10-19T17:04:26.653 回答
1

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

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

编辑:更改脚本,使其打印一组近乎重复的最后一个(tac不需要)。

于 2009-10-19T18:02:06.127 回答