如何从给定的字符串中找到不重复的字母

cod*_*c24 5 text-processing

我有一个字符串aaabefhhhhhthkkd,我只需要从中提取不重复的字母作为输出,保留顺序。

字符串可能包含大写或小写字母。

输入:

aaabefhhhhhthkkd
Run Code Online (Sandbox Code Playgroud)

输出:

beftd
Run Code Online (Sandbox Code Playgroud)

需要如何定义此逻辑才能获得上述所需的输出?

我试图使用这个命令,但它只对我有用:

echo "aaabefhhhhhthkkd" | sed 's/./&\n/g' | uniq
Run Code Online (Sandbox Code Playgroud)

上述部分工作命令的输出:

a
b
e
f
h
t
h
k
d
Run Code Online (Sandbox Code Playgroud)

要测试的示例字符串:

String 1: aaabefhhhhhthkkd -> Output -> beftd

String 2: AAAbefhhhhhThkkD -> Output -> befTD 

String 3: AAAbefhMThkkD    -> Output -> befMTD 
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 5

uniq 仅适用于相邻的重复项 - 因此,如果您想使用它,则需要先对输入进行排序,例如:

fold -w1 | sort | uniq -u | paste -sd ''
Run Code Online (Sandbox Code Playgroud)
  • fold -w1和你的一样,sed 's/./&\n/g'但没有引入额外的虚假换行符
  • sort 使重复的字符相邻
  • uniq -u-u重要的是要只打印单身
  • paste -sd '' 将结果连接回一行

由于排序,您将无法在所有情况下获得所需的输出顺序,例如。

$ echo 'AAAbefhMThkkD' | fold -w1 | sort | uniq -u | paste -sd ''
  DMTbef
Run Code Online (Sandbox Code Playgroud)

如果您不想推出自己的解决方案,您可以随时使用 Perl 的MoreUtils

$ echo 'AAAbefhMThkkD' |
    perl -MList::MoreUtils=singleton -ne 'print singleton split //'
befMTD
Run Code Online (Sandbox Code Playgroud)


cod*_*c24 -1

实现这个花了很长时间,但下面的方法如预期的那样对我有用,我终于完成了!

在下面的字符串上测试

字符串 1: aaabefhhhhhhthkkd -> 输出 -> beftd

字符串 2: AAAbefhhhhThkkD -> 输出 -> befTD

字符串 3: AAAbefhMThkkD -> 输出 -> befMTD

#!/bin/bash

# String passed as an input 
str='AAAbefhMThkkD'

# Taking character count of provided string 
count=$(echo "$str" | tr -cd 'a-z|A-Z' | wc -c)

# Dynamic array created 
dynamic_array=()

# Looping through the for loop 
for (( i=1 ; i<=$((count)) ; i++ ))
{
    c=$(echo "$str" |  cut -c "$i")
    character_count=$(echo "$str" | tr -cd "$c" | wc -c) 
    echo "Character : $c  : $character_count" 

   if [ "$character_count" -eq 1 ]
   then  
        dynamic_array+=("$c")   
   fi           
}

str_array_value="${dynamic_array[*]}" ; echo "Output : ${str_array_value// /}" 

# Input :  aaabefhhhhhthkkd : Output : beftd 
# Input :  AAAbefhhhhhThkkD : Output : befTD
# Input :  AAAbefhMThkkD    : Output : befMTD  
Run Code Online (Sandbox Code Playgroud)

在https://www.shellcheck.net上更正代码

  • 您应该将其复制/粘贴到 http://shellcheck.net 并修复它告诉您的问题。还有其他问题它不会告诉您,因为操作文本并不是 shell 的设计目的,因此很难正确编码。awk 的设计目的是操作文本,而 shell 的设计目的是调用 awk 等工具来执行此类任务。 (2认同)