85

问题

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

例子:

文件.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

想法?

4

7 回答 7

114

这个

  • 使用 计算行长awk,然后
  • sort -n使用and finally对(数字)行长度进行排序
  • 计算唯一的行长度值uniq -c
$ awk '{print length}' input.txt | sort -n | uniq -c
      1 1
      2 2
      3 4
      1 5
      2 6
      2 7

在输出中,第一列是给定长度的行数,第二列是行长。

于 2013-05-25T15:15:50.297 回答
29

纯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
于 2013-05-25T15:31:34.940 回答
12

使用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
于 2013-05-25T15:29:23.790 回答
8
$ perl -lne '$c{length($_)}++ }{ print qq($_ $c{$_}) for (keys %c);' file.txt

输出

6 2
1 1
4 3
7 2
2 2
5 1
于 2013-05-25T15:30:18.440 回答
1

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

于 2021-06-13T04:16:18.057 回答
1

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

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

sed(没有使用or的任何高级技巧awk)将起作用。输出是:

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

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

参考:

人 uniq(1)

人排序(1)

男厕所(1)

于 2019-09-25T17:10:30.353 回答
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. 这是源文件:
    $猫文件.txt
    这个
    是
    一个
    样本
    文件
    和
    一些
    线条
    的
    变化的
    长度
    
  2. 将源文件的每一行替换为其长度:
    $ for line in $( cat file.txt ); 做 printf $line | 厕所-c; 完毕
    4
    2
    1
    6
    4
    4
    7
    5
    2
    7
    6
    
  3. 排序并计算长度出现的次数:
    $ for line in $(cat file.txt); 做 printf $line | 厕所-c; 完成| 排序-n | 唯一的-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
    
于 2017-01-20T09:14:57.697 回答