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操作的结果。