单词文件的内容:
a-b-c
c-b-a
c-a-b
d-a-x
我只想要输出:
a-b-c
d-a-x
因为以下原因:
c-b-a
c-a-b
这些组合来自a-b-c
答案1
这是一个 Perl 解决方案 - 在 awk 中实现留作练习:
$ perl -F'-' -lnE 'say $_ unless $seen{join "-", sort @F}++' file
a-b-c
d-a-x
-
在元素都是单个字符的情况下,不需要重新插入分隔符,但在其他情况下就变得很重要(ab-c
例如为了区分a-bc
)。
答案2
假设您的单词确实是由破折号分隔的简单字符串,您可以使用施瓦茨变换像这样
#!/bin/bash
# Assumes words are in /tmp/words
while IFS= read line
do
sorted=$(printf "%s\n" "$line" | tr - '\n' | LC_ALL=C sort | tr '\n' -)
# printf "sorted= >%s<, line= >%s<\n" "$sorted" "$line" >&2
printf "%s\t%s\n" "$line" "$sorted"
done < /tmp/words |
sort -t $'\t' -uk2,3 |
cut -f1
破折号之间的“单词”被分开,按字母数字排序,然后重新连接。 (取消printf
中间的注释以查看这些排序的行。)这用作具有sort
唯一性约束的排序键,因此包含重复键的行将被丢弃。副作用是原始顺序被改变;如果这是不可接受的,您应该在问题中将其声明为新要求。然后丢弃排序键并输出原始数据。
您的问题中提供的数据的示例输出
a-b-c
d-a-x
注意事项
- 假设数据是用破折号分隔的“单词”
- 假设数据不包含奇怪的字符(制表符、换行符)