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

时间:2013-05-25 15:12:17

标签: bash shell command-line scripting

问题

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

实施例

file.txt的

this
is
a
sample
file
with
several
lines
of
varying
length

运行count_line_lengths file.txt会给出:

Length Occurences
1      1
2      2
4      3
5      1
6      2
7      2

想法?

7 个答案:

答案 0 :(得分:80)

count.awk:

{
  print length($0);
}

...

$ awk -f count.awk input.txt | sort | uniq -c
      1 1
      2 2
      3 4
      1 5
      2 6
      2 7

答案 1 :(得分:24)

Pure 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

答案 2 :(得分: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

示例运行:

$ ./t.sh
Length Occurrence
1      1
2      2
4      3
5      1
6      2
7      2

答案 3 :(得分:7)

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

Output

6 2
1 1
4 3
7 2
2 2
5 1

答案 4 :(得分:1)

您只能使用基本的unix实用程序来完成此操作:

$ printf "%s %s\n" $(for line in $(cat file.txt); do printf $line | wc -c; done | sort -n | uniq -c | sed -E "s/([0-9]+)[^0-9]+([0-9]+)/\2 \1/")
1 1
2 2
4 3
5 1
6 2
7 2

它是如何工作的?

  1. 这是源文件:
    $ cat file.txt
    this
    is
    a
    sample
    file
    with
    several
    lines
    of
    varying
    length
    
  2. 用其长度替换源文件的每一行:
    $ for line in $(cat file.txt); do printf $line | wc -c; done
    4
    2
    1
    6
    4
    4
    7
    5
    2
    7
    6
    
  3. 对长度事件的数量进行排序和计数:
    $ for line in $(cat file.txt); do printf $line | wc -c; done | sort -n | uniq -c
          1 1
          2 2
          3 4
          1 5
          2 6
          2 7
    
  4. 交换并格式化数字:
    $ printf "%s %s\n" $(for line in $(cat file.txt); do printf $line | wc -c; done | sort -n | uniq -c | sed -E "s/([0-9]+)[^0-9]+([0-9]+)/\2 \1/") 
    1 1
    2 2
    4 3
    5 1
    6 2
    7 2
    

答案 5 :(得分:0)

如果您允许交换列并且不需要标题,那么就像

while read line; do echo -n $line | wc -m; done < file | sort | uniq -c

(不带sedawk的任何高级技巧)将起作用。输出为:

1 1
2 2
3 4
1 5
2 6
2 7

要记住的一件事:wc -c会计算字节数,而不是字符数,并且不会为包含多字节字符的字符串提供正确的长度。因此,使用wc -m

参考文献:

man uniq(1)

man sort(1)

man wc(1)

答案 6 :(得分:0)

试试这个: awk '{打印长度}' 或者下一步,如果你想要最长的长度: awk '{ln=length} ln>max{max=ln} END {print FILENAME " " max}' 您可以使用 -exec 选项将上述命令与 find 结合使用。