繁体   English   中英

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

[英]How can I list unique characters used in a text file using linux command line tools?

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

uniq实用程序仅适用于行。

我会用od

od -cvAnone -w1

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


例子:

所以,列出唯一的:

od -cvAnone -w1 | sort -bu

或者产生前20个直方图:

od -cvAnone -w1 | sort -b | uniq -c | sort -rn | head -n 20

在IdeOne上观看Live

我更喜欢这种方式:

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

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

这个脚本有三个部分:

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

1)

BEGIN{FS=""} 

从这里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);}}

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

3)

END{for(c in chars){print c;} }

最后一节 - 遍历整个数组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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM