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

Urv*_*shi 15 shell duplicate xargs shell-script text-processing

我有一个像

"aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc"
Run Code Online (Sandbox Code Playgroud)

我想从字符串中删除重复的单词然后输出就像

"aaa,bbb,ccc"
Run Code Online (Sandbox Code Playgroud)

我试过这个代码

$ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs
Run Code Online (Sandbox Code Playgroud)

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

如何删除重复值。

更新

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

   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
Run Code Online (Sandbox Code Playgroud)

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

while read the records 

    if [ "$c" == "" ]; then  #$c I defined global
        c="$colour1"
    else
        c="$c,$colour1" 
    fi
Run Code Online (Sandbox Code Playgroud)

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

"red,black,blue,red,green,red,black,blue,red,green,"
Run Code Online (Sandbox Code Playgroud)

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

"red,black,blue,green"
Run Code Online (Sandbox Code Playgroud)

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

 echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs
Run Code Online (Sandbox Code Playgroud)

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

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

Geo*_*iou 16

再来一个 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 
Run Code Online (Sandbox Code Playgroud)

顺便说一句,即使您的解决方案也适用于变量:

$ b="zebra ant spider spider ant zebra ant" 
$ echo "$b" | xargs -n1 | sort -u | xargs
ant spider zebra
Run Code Online (Sandbox Code Playgroud)


Mic*_* D. 11

tr,sortuniq

echo "zebra ant spider spider ant zebra ant" | tr ' ' '\n' | sort -u
Run Code Online (Sandbox Code Playgroud)

或者

echo "zebra ant spider spider ant zebra ant" | tr ' ' '\n' | sort -u | xargs 
Run Code Online (Sandbox Code Playgroud)

得到一行

  • 或者使用`sort -u`。甚至是`awk '!u[$0]++`。 (4认同)
  • @Benoît 哇,我不知道`sort -u`。我一直在使用`sort | uniq 一直以来。浪费的按键... (2认同)

JJo*_*oao 8

$ echo "zebra ant spider spider ant zebra ant"  | awk -v RS="[ \n]+" '!n[$0]++' 
zebra
ant
spider
Run Code Online (Sandbox Code Playgroud)