我有一个字符串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)
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上更正代码