Awk 如何删除分隔文本行中的重复项

Awk 如何删除分隔文本行中的重复项,awk,Awk,删除行中分隔项内的重复项(不一定是连续的)的智能且简单的方法是什么 之前: apple,banana,apple,cherry,cherry delta,epsilon,delta,epsilon apple pie,delta,delta 之后: apple,banana,cherry delta,epsilon apple pie,delta 应该在Mac上工作。允许使用unicode。任何shell方法/语言/命令。重复不一定是连续的 注意:这个问题是--的一个变体,用于用空行分隔的文

删除行中分隔项内的重复项(不一定是连续的)的智能且简单的方法是什么

之前:

apple,banana,apple,cherry,cherry
delta,epsilon,delta,epsilon
apple pie,delta,delta
之后:

apple,banana,cherry
delta,epsilon
apple pie,delta
应该在Mac上工作。允许使用unicode。任何shell方法/语言/命令。重复不一定是连续的

注意:这个问题是--的一个变体,用于用空行分隔的文本块

$awk'开始{FS=OFS=“,”}
$ awk 'BEGIN { FS=OFS="," }
{
    delete seen
    sep=""
    for (i=1;i<=NF;i++) {
        if (!seen[$i]++) {
            printf "%s%s", sep, $i
            sep = OFS
        }
    }
    print ""
}' file
apple,banana,cherry
delta,epsilon
apple pie,delta
{ 删除所见 sep=“” 对于(i=1;i
只需编码。

没有一行代码?我想它可以是一行代码,通过tr before/after.Ed Morton脚本在一行中添加分号awk-v of s=“,”-F“,”{delete seen;sep=“”;for(I=1;iYou可以通过在每行末尾添加分号将任何awk脚本填充到一行中,而不是{}
但根据我的经验,这造成了一个难以辨认的混乱,没有任何好处。这个问题很容易维护和修改。Ed对这个问题的一个变体()的解决方案非常优雅,因此为了我的目的,我将这个分隔格式(带逗号)转换为/从每行一个格式(带tr和/或sed)。这会产生一个非常容易阅读的管道式单页夹。如果您打算加入trs和SED只是为了让它保持在一行上,那么您最好使用不太清晰的(比上面的)和特定于呆滞的:
awk'BEGIN{RS=“[,\n]”!seen[$0]+{r=RS$0;s=“,”}RT==“\n”{print r;r=s=“;delete seen}'file
wrt awk版本:当苹果和菠萝都出现在同一行时,你会发现它会删除苹果或截断菠萝,这取决于它们在行中的顺序。你需要添加特定于gawk的单词边界(只有当每个字段中的字符都是单词组成部分时才有效)或其他一些分隔符,如果字段中出现任何regexp元字符,则仍将失败。它也不会以所需的顺序生成输出,因为它会删除每个字符串的第一次出现,而不是后续出现的字符串。sed有一些类似的问题。任何时候发布“如何删除DUP”在一个示例输入中,你应该包括一个单词是另一个单词的子串,例如“代码>苹果,菠萝< /代码>。因为通常情况下,除非它的特定部分是问题,否则人们编写的解决方案不会考虑该情况。此外,如果重新出现元字符,例如<代码> .<代码>,<代码> */COD>,<代码> ,等等。然后也包括这些,因为人们经常提出基于regexp的解决方案,而不是基于字符串的解决方案,而且当出现RE元字符时,要正确处理这些问题要困难得多。
awk -F, '{ for(i=1;i<=NF;i++) if( split($0,t,$i)>2 ) sub($i",","") }1' file             
banana,apple,cherry
delta,epsilon
apple pie,delta
sed -r 's/(.+)(.*),\1/\1\2,/g;s/,$//' file
apple,banana,cherry
delta,epsilon
apple pie,delta