问题
如果我有一个长文件,其中包含许多行,这些行的长度各不相同,该如何计算每行长度的出现次数?
例:
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
有想法吗?
如果我有一个长文件,其中包含许多行,这些行的长度各不相同,该如何计算每行长度的出现次数?
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
有想法吗?
Answers:
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
awk '{print length}' input.txt | sort | uniq -c
uniq
可以在里面awk
轻松完成。我想排序也可以在中完成gawk
。我更喜欢纯bash
解决方案。
1 9575 1 999
。要正确地对数字sort -g
进行排序,请使用,使原始awk '{print length}' input.txt | sort -g | uniq -c
sort
命令LC_ALL=C sort
也将具有对字符进行正确排序以及更快的优点。
使用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
awk
胜出;-)刚发布它是因为OP明确要求不涉及另一种外部语言的内容,这也意味着awk
(这就是我的阅读方式)。从while read l;do((h[${#l}]++));done<file.txt;for l in "${!h[@]}";do echo "$l ${h[$l]}";done
$ perl -lne '$c{length($_)}++ }{ print qq($_ $c{$_}) for (keys %c);' file.txt
6 2
1 1
4 3
7 2
2 2
5 1
perl -lnE '$c{+length}++}{say "$_ $c{$_}" for keys %c'
您可以仅通过使用基本的unix实用程序来完成此操作:
$ printf“%s%s \ n” $(用于$(cat file.txt)中的行;执行printf $ line | wc -c;完成|排序-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
$ cat file.txt 这个 是 一种 样品 文件 与 一些 线 的 变化的 长度
$代表$(cat file.txt )中的行;做printf $ line | wc -c; 完成 4 2 1个 6 4 4 7 5 2 7 6
$用于$(cat file.txt)中的行;做printf $ line | wc -c; 完成| 排序-n | uniq -c 1 1 2 2 3 4 1 5 2 6 2 7
$ printf“%s%s \ n” $(用于$(cat file.txt)中的行;执行printf $ line | wc -c;完成|排序-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
wc -c
计算字节,而不是字符。如果您使用多字节字符,则会得到较大的数字。试试 echo -n "你好" | wc -c
vs. echo -n“你好” | wc -m`。
wc -c
为wc -m
吗?
length=1
是哪个词?您也应该存储单词。