さまざまな長さの行がたくさんある長いファイルがある場合、各行の長さの出現をカウントするにはどうすればよいですか?
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
アイデア?
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
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
$ Perl -lne '$c{length($_)}++ }{ print qq($_ $c{$_}) for (keys %c);' file.txt
6 2
1 1
4 3
7 2
2 2
5 1
これを行うには、基本的なUNIXユーティリティのみを使用します。
$ printf "%s%s\n" $(for $(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
$ $(の行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;やった | sort -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;完了| 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