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

时间:2014-04-22 08:37:30

标签: linux terminal character unique

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

uniq实用程序仅适用于行。

2 个答案:

答案 0 :(得分:11)

我会使用od

od -cvAnone -w1

这会列出字符,显示不可显示的\escapes。其他formats are available


示例:

所以,列出唯一身份:

od -cvAnone -w1 | sort -bu

或者产生前20个直方图:

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

查看 Live On IdeOne

答案 1 :(得分:5)

我更喜欢这种方式:

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

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

这个脚本有三个部分:

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

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的处理方式。 寻找一个相对较大的文本文件。使用关联数组的速度要快6倍:

>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