使用 shell 脚本从字符串中删除所有重复的单词

使用 shell 脚本从字符串中删除所有重复的单词

我有一个像这样的字符串

"aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc"

我想从字符串中删除重复的单词,然后输出将类似于

"aaa,bbb,ccc"

我试过这段代码来源

$ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs

它在相同的值下工作正常,但是当我给出变量值时,它也会显示所有重复的单词。

如何删除重复值。

更新

我的问题是,如果用户相同,则将所有相应的值添加到单个字符串中。我有这样的数据 ->

   user name    | colour
    AAA         | red
    AAA         | black
    BBB         | red
    BBB         | blue
    AAA         | blue
    AAA         | red
    CCC         | red
    CCC         | red
    AAA         | green
    AAA         | red
    AAA         | black
    BBB         | red
    BBB         | blue
    AAA         | blue
    AAA         | red
    CCC         | red
    CCC         | red
    AAA         | green

在编码中,我获取所有不同的用户,然后成功连接颜色字符串。为此,我使用代码 -

while read the records 

    if [ "$c" == "" ]; then  #$c I defined global
        c="$colour1"
    else
        c="$c,$colour1" 
    fi

当我打印这个 $c 变量时,我得到输出(对于用户 AAA)

"red,black,blue,red,green,red,black,blue,red,green,"

我想删除重复的颜色。然后所需的输出应该是这样的

"red,black,blue,green"

对于这个所需的输出,我使用了上面的代码

 echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs

但它显示的输出具有重复的值。就像

“红,黑,蓝,红,绿,红,黑,蓝,红,绿,”谢谢

答案1

还有一个 awk,只是为了好玩:

$ a="aaa bbb aaa bbb ccc aaa ddd bbb ccc"
$ echo "$a" | awk '{for (i=1;i<=NF;i++) if (!a[$i]++) printf("%s%s",$i,FS)}{printf("\n")}'
aaa bbb ccc ddd 

顺便说一句,即使您的解决方案也可以很好地处理变量:

$ b="zebra ant spider spider ant zebra ant" 
$ echo "$b" | xargs -n1 | sort -u | xargs
ant spider zebra

答案2

tr,sortuniq

echo "zebra ant spider spider ant zebra ant" | tr ' ' '\n' | sort -u

或者

echo "zebra ant spider spider ant zebra ant" | tr ' ' '\n' | sort -u | xargs 

得到一根线

答案3

$ echo "zebra ant spider spider ant zebra ant"  | awk -v RS="[ \n]+" '!n[$0]++' 
zebra
ant
spider

答案4

perl -lane '$,=$";print grep { ! $h{$_}++ } @F'

相关内容