如何显示 Bash 字符串中包含的唯一单词?

如何显示 Bash 字符串中包含的唯一单词?

单词文件的内容:

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‬

注意事项

  1. 假设数据是用破折号分隔的“单词”
  2. 假设数据不包含奇怪的字符(制表符、换行符)

相关内容