如果我有一个包含大量不同长度行的长文件,我该如何计算每行长度的出现次数?
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
想法?
答案 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
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
$ 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
答案 5 :(得分:0)
如果您允许交换列并且不需要标题,那么就像
while read line; do echo -n $line | wc -m; done < file | sort | uniq -c
(不带sed
或awk
的任何高级技巧)将起作用。输出为:
1 1
2 2
3 4
1 5
2 6
2 7
要记住的一件事:wc -c
会计算字节数,而不是字符数,并且不会为包含多字节字符的字符串提供正确的长度。因此,使用wc -m
。
参考文献:
答案 6 :(得分:0)
试试这个: awk '{打印长度}' 或者下一步,如果你想要最长的长度: awk '{ln=length} ln>max{max=ln} END {print FILENAME " " max}' 您可以使用 -exec 选项将上述命令与 find 结合使用。