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

xa9qqrwz  于 11个月前  发布在  Shell
关注(0)|答案(7)|浏览(130)

问题
如果我有一个很长的文件,其中有很多不同长度的行,我如何计算每行长度的出现次数?

示例:

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


想法?

wxclj1h5

wxclj1h51#

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

字符串
在输出中,第一列是具有给定长度的行数,第二列是行长度。

ruoxqz4g

ruoxqz4g2#

纯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

字符串

xtfmy6hx

xtfmy6hx3#

使用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

lxkprmvk

lxkprmvk4#

$ 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

vulvrdjw

vulvrdjw5#

如果您允许交换列,并且不需要标题,那么可以使用以下简单的方法:
第一个月
(没有任何sedawk的高级技巧)将工作。输出是:
需要记住的一件重要的事情是:wc -c计算的是字节数,而不是字符数,并且不会给予包含多字节字符的字符串的正确长度。因此使用wc -m
参考文献:
man uniq(1)
man sort(1)
man wc(1)

rxztt3cl

rxztt3cl6#

试试这个:

awk '{print length}' FILENAME

字符串
如果你想要最长的长度:

awk '{ln=length} ln>max{max=ln} END {print FILENAME " " max}'


您可以使用-exec选项将上面的合并命令与find命令结合使用。

laik7k3q

laik7k3q7#

你可以通过使用基本的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

1.将源文件的每一行替换为其长度:

$ **for line in $(**cat file.txt**); do printf $line | wc -c; done**
4
2
1
6
4
4
7
5
2
7
6

1.对长度出现的次数进行排序和计数:

$ 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

1.交换并格式化数字:

$ **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

相关问题