问题
如果我有一个长文件,其中包含很多长度不同的行,如何计算每个行长度的出现次数?
示例:
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
有什么想法吗?
这个命令使用 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
在输出中,第一列是给定长度的行数,第二列是行长度。
在输出中,第一列是给定长度的行数,第二列是行长度。
awk '{print length}' input.txt | sort -n | uniq -c
- Anders Johanssonawk
中完成。我想排序也可以在gawk
中完成。我更喜欢纯bash
解决方案。 - TrueY1 9575 1 999
这样的输出)。要正确地排序数字,请使用sort -g
,将原始命令改为awk '{print length}' input.txt | sort -g | uniq -c
。 - user82116sort
命令替换为LC_ALL=C sort
不仅可以正确地排序字符,而且速度更快。 - Hashim Aziz纯 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
使用 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
,它甚至没有那么长... - Adrian Frühwirth$ 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'
- glenn jackman试试这个:
awk '{print length}' FILENAME
如果您想要最长的长度,请使用“next”:
awk '{ln=length} ln>max{max=ln} END {print FILENAME " " max}'
$ 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
$ cat file.txt this is a sample file with several lines of varying length
$ for line in $(cat file.txt); do printf $line | wc -c; done 4 2 1 6 4 4 7 5 2 7 6
$ 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
$ 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
wc -c
计算的是字节而不是字符。如果你有多字节字符,你会得到更大的数字。尝试 echo -n "你好" | wc -c
和 echo -n "你好" | wc -m
的区别。 - imrekwc -c
替换为 wc -m
吗? - Maksym Ganenko%
字符都会导致意外结果。 - sampi
length=1
是哪个单词?你也应该存储这个单词。 - Bill