我该如何扭转这种情况:
Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef.
对此:
abcdefghiklnoprstuwFJT',():.
(这些是输入中使用的字符总数)
请注意,小写字符“jmqvz”不在输入句子中,因此不会输出。
顺序并不重要,但优先考虑小写字母、大写字母、特殊字符。
我确信我需要 sed/awk/etc. 来实现这一点,但经过广泛的搜索后我还没有找到任何类似的东西。
答案1
sed
您可以使用和的组合sort
:
$ echo "Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef." |
> sed 's/./&\n/g' | LC_COLLATE=C sort -u | tr -d '\n'
'(),.:FJTabcdefghiklnoprstuwxy
sort
按字典顺序排序,因此请参见man 7 ascii
看看角色会如何排序。
解释:
sed 's/./&\n/g'
- 在每个字符后添加一个换行符,因为sort
(通常)逐行排序LC_COLLATE=C
将排序规则样式设置为C
(参见“LC_ALL=C” 起什么作用?)sort -u
:对输入进行排序并仅打印唯一条目tr -d '\n'
删除所有多余的新行。
如果您只想保留可见的字符:
$ echo "Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef." |
> tr -cd '[[:graph:]]' | sed 's/./&\n/g' | LC_COLLATE=C sort -u | tr -d '\n'
tr -cd '[[:graph:]]'
删除除可见字符之外的所有内容。
答案2
您可以使用 打印文件中的每个字符,然后使用(或)fold -w1
对输出进行排序并消除重复项。例如,假设我们有以下文件sort -u
sort | uniq
$ cat test
Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef.
每行打印一个字符
$ fold -w1 test | sort -u
,
:
.
'
(
)
a
b
c
d
e
f
F
g
h
i
J
k
l
n
o
p
r
s
t
T
u
w
x
y
然后您可以再次将其变成一行,例如使用paste -sd "" -
:
$ fold -w1 test | sort -u | paste -sd "" -
,:.'()abcdefFghiJklnoprstTuwxy
答案3
哦,真有趣!这里有几种方法。最简单的 ( fold
) 已经给出,但这里有一种方法可以扩展它,以便同时给出每个字符的计数:
$ fold -w 1 file | LC_ALL=C sort | uniq -c
11
2 "
1 '
1 (
1 )
3 ,
1 .
1 :
1 F
1 J
1 T
1 a
1 b
2 c
2 d
9 e
4 f
2 g
4 h
5 i
1 k
3 l
7 n
6 o
1 p
2 r
4 s
1 t
2 u
1 w
1 x
1 y
使用LC_ALL=C
将命令的区域设置为 C sort
,这意味着大写字母按您的要求排在小写字母之前。要使所有内容在同一行上而不计算出现次数,但使用相同的排序顺序,您可以执行
$ echo $(fold -w 1 file | LC_ALL=C sort -u | tr -d '\n')
"'(),.:FJTabcdefghiklnoprstuwxy
您也可以使用 Perl:
$ perl -lne '$k{$_}++ for split(//); END{print sort keys(%k)}' file
"'(),.:FJTabcdefghiklnoprstuwxy
最后,这里有一种方法可以显示特殊字符,如制表符、换行符和回车符:
$ echo $(od -c file | grep -oP "^\d+ +\K.*" | tr -s ' ' '\n' |
LC_ALL=C sort -u | tr -d '\n')
"'(),.:FJT\n\r\tabcdefghiklnoprstuwxy
------
|-------------> special characters
答案4
只需从输入字符串中删除重复的字符。pythonset
中的函数将创建一组没有任何重复的项目。即,set('ssss')
将给你一个s
。
通过python3
$ cat file
Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef.
$ python3 -c 'import sys
with open(sys.argv[1]) as f:
for line in f:
print("".join(sorted(set(line))))' file
'(),.:FJTabcdefghiklnoprstuwxy
如果您想删除整个文件中的重复字符,那么您可以尝试这个。
$ python3 -c 'import sys
with open(sys.argv[1]) as f:
print("".join(sorted(set(f.read()))))' file