列出文件中使用的每个字符的实用方法是什么(Bash)(Regex)

列出文件中使用的每个字符的实用方法是什么(Bash)(Regex)

我该如何扭转这种情况:

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 -usort | 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

相关内容