排序和删除一行中的重复单词

Vil*_*age 31 sorting bash

sort命令允许我按字母顺序放置行并删除重复的行.我需要类似的东西,可以在单行上排序,按顺序排列,并删除任何重复.有这个命令吗?

例如:

zebra ant spider spider ant zebra ant
Run Code Online (Sandbox Code Playgroud)

变更为:

ant spider zebra
Run Code Online (Sandbox Code Playgroud)

在第一个单词之前或最后一个单词之后没有空格.

jco*_*ado 68

这对我有用:

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

您可以将单个行中的单词列表转换为单个列xargs -n1,sort -u并使用,转换回单个行xargs.


小智 29

shell的构建是为了解析[:blank:]分隔的单词列表.因此,使用xargs完全是多余的."独特"的东西可以完成,但它更容易使用排序.

echo $(printf '%s\n' zebra ant spider spider ant zebra ant | sort -u)

  • 我喜欢这个答案。您能详细说明一下对“回声”的需求吗?你能不能只做:``printf'%s\n' 斑马蚂蚁蜘蛛蜘蛛蚂蚁斑马蚂蚁 | 排序-u`` (2认同)
  • 啊。我想到了。这是为了让它们再次回到字符串中,而不是多行。我会将我的评论留给下一个人不能立即弄清楚的人。 (2认同)

dog*_*ane 8

使用tr改变空格的新线,然后sort,最后更换新线回位.

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


Car*_*ood 6

在此之前的所有答案一次只能对一行进行排序。以下内容可用于将这些行的整个列表通过管道传输到其中,它将打印每行的唯一单词的排序列表。

awk '{ delete a; for (i=1; i<=NF; i++) a[$i]++; n=asorti(a, b); for (i=1; i<=n; i++) printf b[i]" "; print "" }'
Run Code Online (Sandbox Code Playgroud)

感谢 @jaypai 在这里使用了很多语法。

例子:

>cat file
group label wearable edit_group edit_group_order label_max camera_elevation camera_distance name label_min label_max value_min value_max camera_angle camera_elevation id
id group label wearable edit_group clothing_morph value_min value_max name value_default clothing_morph group
id label show_simple wearable name edit_group edit_group_order group clothing_morph clothing_morph camera_distance label_min label_max value_min value_max camera_distance camera_angle
id group label wearable name edit_group clothing_morph value_min value_max value_default
group label wearable id clothing_morph edit_group edit_group_order label_min label_max value_min value_max name camera_distance camera_angle camera_elevation
id group label wearable edit_group name label_min label_max value_min value_max wearable
name id group wearable edit_group id group wearable id group wearable id group wearable value_min value_max

>cat file | awk '{ delete a; for (i=1; i<=NF; i++) a[$i]++; n=asorti(a, b); for (i=1; i<=n; i++) printf b[i]" "; print "" }'
camera_angle camera_distance camera_elevation edit_group edit_group_order group id label label_max label_min name value_max value_min wearable 
clothing_morph edit_group group id label name value_default value_max value_min wearable 
camera_angle camera_distance clothing_morph edit_group edit_group_order group id label label_max label_min name show_simple value_max value_min wearable 
clothing_morph edit_group group id label name value_default value_max value_min wearable 
camera_angle camera_distance camera_elevation clothing_morph edit_group edit_group_order group id label label_max label_min name value_max value_min wearable 
edit_group group id label label_max label_min name value_max value_min wearable 
edit_group group id name value_max value_min wearable
Run Code Online (Sandbox Code Playgroud)