使用命令行工具计算文件中的行长度

Pet*_*ton 61 bash shell scripting command-line

问题

如果我有一个包含许多不同长度行的长文件,我如何计算每个行长度的出现次数?

例:

file.txt的

this
is
a
sample
file
with
several
lines
of
varying
length
Run Code Online (Sandbox Code Playgroud)

跑步count_line_lengths file.txt会给:

Length Occurences
1      1
2      2
4      3
5      1
6      2
7      2
Run Code Online (Sandbox Code Playgroud)

想法?

Ign*_*ams 90

count.awk:

{
  print length($0);
}
Run Code Online (Sandbox Code Playgroud)

...

$ awk -f count.awk input.txt | sort | uniq -c
      1 1
      2 2
      3 4
      1 5
      2 6
      2 7
Run Code Online (Sandbox Code Playgroud)

  • 或更短:`awk'{print length}'input.txt | 排序| uniq -c` (68认同)
  • 我做了这个,但我们有*真的*长行和排序默认情况下没有正确排序数字(我输出像这样的`1 9575 1 999`.要正确排序数字使用`sort -g`,制作原始` awk'{print length}'input.txt | sort -g | uniq -c` (7认同)
  • 不错的管道蛇,但计数和 uniq 可以在 `awk` 内轻松完成。我想排序也可以在“gawk”中完成。我更喜欢纯粹的“bash”解决方案。 (2认同)

iru*_*var 24

纯粹的awk

awk '{++a[length()]} END{for (i in a) print i, a[i]}' file.txt

4 3
5 1
6 2
7 2
1 1
2 2
Run Code Online (Sandbox Code Playgroud)


Adr*_*rth 10

使用bash数组:

#!/bin/bash

while read line; do
    ((histogram[${#line}]++))
done < file.txt

echo "Length Occurrence"
for length in "${!histogram[@]}"; do
    printf "%-6s %s\n" "${length}" "${histogram[$length]}"
done
Run Code Online (Sandbox Code Playgroud)

示例运行:

$ ./t.sh
Length Occurrence
1      1
2      2
4      3
5      1
6      2
7      2
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 7

$ perl -lne '$c{length($_)}++ }{ print qq($_ $c{$_}) for (keys %c);' file.txt
Run Code Online (Sandbox Code Playgroud)

产量

6 2
1 1
4 3
7 2
2 2
5 1
Run Code Online (Sandbox Code Playgroud)

  • 打高尔夫乐趣:`perl -lnE'$ c {+ length} ++} {对于密钥%c',请说"$ _ $ c {$ _}" (2认同)
  • 我有一个病态长行(700-1000MB)的文件和所有的单行文件,只有这个文件没有崩溃.+1! (2认同)