web-dev-qa-db-ja.com

コマンドラインツールを使用してファイル内の行の長さをカウントする

問題

さまざまな長さの行がたくさんある長いファイルがある場合、各行の長さの出現をカウントするにはどうすればよいですか?

例:

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

アイデア?

60
Peter Hamilton

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
24
iruvar

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
10
$ Perl -lne '$c{length($_)}++ }{ print qq($_ $c{$_}) for (keys %c);' file.txt

出力

6 2
1 1
4 3
7 2
2 2
5 1
7
jfs

これを行うには、基本的な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 

使い方?

  1. ソースファイルは次のとおりです。
    $ cat file.txt 
     this 
     is 
     a 
     sample 
     file 
     with 
     several 
     lines 
     of 
     varying 
     length 
    
  2. ソースファイルの各行をその長さで置き換えます:
    $(の行cat file.txt); printf $ lineを実行します| wc -c;やった
     4 
     2 
     1 
     6 
     4 
     4 
     7 
     5 
     2 
     7 
     6 
    
  3. 長さの出現回数をソートしてカウントします:
    $(cat file.txt)の行に対して; printf $ lineを実行します| wc -c;やった | sort -n | uniq -c
     1 1 
     2 2 
     3 4 
     1 5 
     2 6 
     2 7 
    
  4. 番号を交換してフォーマットします:
    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 
    
1
Maksym Ganenko