我想使用linux命令行工具列出文本文件中使用的一组字符。我怎样才能做到这一点?
uniq
实用程序仅适用于行。
答案 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
答案 1 :(得分:5)
我更喜欢这种方式:
awk 'BEGIN{FS=""} {for(i=1;i<=NF;i++){chars[$(i)]=$(i);}} END{for(c in chars){print c;} }'
所以这个脚本是awk setipt。 awk对于处理各种命令的输出很有用。
这个脚本有三个部分:
1)
BEGIN{FS=""}
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