如何使用linux命令行工具列出文本文件中使用的唯一字符?

Pat*_*ryk 10 linux terminal character unique

我想使用linux命令行工具列出文本文件中使用的一组字符.我怎样才能做到这一点?

uniq 实用程序仅适用于线路.

seh*_*ehe 12

我用了 od

od -cvAnone -w1
Run Code Online (Sandbox Code Playgroud)

这将列出显示\escapes不可显示的字符.其他格式可用


例子:

所以,列出唯一的:

od -cvAnone -w1 | sort -bu
Run Code Online (Sandbox Code Playgroud)

或者产生前20个直方图:

od -cvAnone -w1 | sort -b | uniq -c | sort -rn | head -n 20
Run Code Online (Sandbox Code Playgroud)

在IdeOne上观看Live


Ser*_*kov 6

我更喜欢这种方式:

awk 'BEGIN{FS=""} {for(i=1;i<=NF;i++){chars[$(i)]=$(i);}} END{for(c in chars){print c;} }'
Run Code Online (Sandbox Code Playgroud)

所以这个脚本是awk setipt.awk对于处理各种命令的输出很有用.

这个脚本有三个部分:

  • BEGIN,在处理之前完成一次
  • 结束,这是在处理之后完成的
  • 在中间有一个处理输出的循环

1)

BEGIN{FS=""} 
Run Code Online (Sandbox Code Playgroud)

从这里http://www.gnu.org/software/gawk/manual/html_node/Field-Splitting-Summary.html#Field-Splitting-Summary

FS ==""记录中的每个字符都成为一个单独的字段.(这是一个gawk扩展;它没有由POSIX标准指定.)

2)

{for(i=1;i<=NF;i++){chars[$(i)]=$(i);}}
Run Code Online (Sandbox Code Playgroud)

chars只是一维关联数组(http://www.gnu.org/software/gawk/manual/html_node/Array-Basics.html#Array-Basics).我在处理每个char时在其中添加值.

3)

END{for(c in chars){print c;} }
Run Code Online (Sandbox Code Playgroud)

最后一节 - 遍历整个数组chars并打印其索引.http://www.gnu.org/software/gawk/manual/html_node/Scanning-an-Array.html#Scanning-an-Array

PS.

至于@sehe的处理方式.寻找一个相对较大的文本文件.使用关联数组的速度提高了六倍:

>time od -cvAnone -w1 vector.html.big | sort -bu > /dev/null

real    0m1.597s
user    0m1.619s
sys     0m0.022s

>time awk 'BEGIN{FS=""} {for(i=1;i<=NF;i++){chars[$(i)]=$(i);}} END{for(c in chars){print c;} }' vector.html.big | sort >/dev/null

real    0m0.252s
user    0m0.251s
sys     0m0.002s
Run Code Online (Sandbox Code Playgroud)