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

ht4b089n  于 2023-06-21  发布在  Linux
关注(0)|答案(3)|浏览(99)

我想用linux命令行工具列出一组在文本文件中使用的字符。我如何才能做到这一点?
uniq实用程序仅在线路上工作。

ufj5ltwl

ufj5ltwl1#

我会使用od

od -cvAnone -w1

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

示例:

因此,要列出unique:

od -cvAnone -w1 | sort -bu

或者生成前20个直方图:

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

看到它**Live On IdeOne**

v8wbuo2f

v8wbuo2f2#

我更喜欢这样:

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

所以这个脚本是awk setipt。awk对于处理各种命令的输出很有用。
此脚本包含三个部分:

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

第一章

BEGIN{FS=""}

从这里www.example.com 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)。我在处理每个字符的同时在其中添加值。
3)

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

最后一部分-遍历整个数组chars并打印其索引。www.example.com http://www.gnu.org/software/gawk/manual/html_node/Scanning-an-Array.html#Scanning-an-Array
附言
至于@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
vs91vp4v

vs91vp4v3#

下面是一种Perl方式,它打印Unicode码位和字符本身:

perl -C7 -ne 'for (split(//)) {print sprintf("U+%04X", ord)." ".$_."\n"}' $Your_File | sort -u

或多行以提高可读性:

perl -C7 -ne 'for ( split(//) ) {
    print sprintf("U+%04X", ord) . " " . $_ . "\n"
    }' $Your_File \
| sort -u

相关问题