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

时间:2012-01-10 11:43:31

标签: bash sorting

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

E.g:

zebra ant spider spider ant zebra ant

更改为:

ant spider zebra

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

7 个答案:

答案 0 :(得分:66)

这对我有用:

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

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

答案 1 :(得分:29)

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

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

答案 2 :(得分:8)

使用tr将空格更改为新行,然后sort,最后将新行更改回空格。

echo $(tr ' ' '\n' <<< "zebra ant spider spider ant zebra ant" | sort -u)

答案 3 :(得分:3)

在此之前的所有答案只能对一行进行排序。 以下内容可用于管理这些行的整个列表,并将打印每行的唯一单词的排序列表。

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 "" }'

感谢@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

答案 4 :(得分:1)

使用python

$ echo "zebra ant spider spider ant zebra ant" | python -c 'import sys; print(" ".join(sorted(set(sys.stdin.read().split()))))'
ant spider zebra

答案 5 :(得分:1)

使用perl

perl -lane '
  %a = map { $_ => 1 } @F;
  print join qq[ ], sort keys %a;
' <<< "zebra ant spider spider ant zebra ant"

结果:

ant spider zebra

答案 6 :(得分:1)

使用awk

awk '{for(i=1;i<=NF;i++) a[$i]++} END{for(i in a) printf i" ";print ""}' INPUT_FILE

测试:

[jaypal:~/Temp] cat file
zebra ant spider spider ant zebra ant
[jaypal:~/Temp] awk '{for (i=1;i<=NF;i++) a[$i]++} END{for (i in a) printf i" ";print ""}' file
zebra spider ant