IT TIP

명령 줄 도구를 사용하여 파일의 줄 길이 계산

itqueen 2020. 12. 3. 21:32
반응형

명령 줄 도구를 사용하여 파일의 줄 길이 계산


문제

다양한 길이의 줄이 많은 긴 파일이있는 경우 각 줄 길이의 발생 횟수를 어떻게 계산할 수 있습니까?

예:

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

기본 유닉스 유틸리티 만 사용하여이를 수행 할 수 있습니다.

$ 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

어떻게 작동합니까?

  1. 다음은 소스 파일입니다.
    $ cat file.txt
    이다
    견본
    파일
    몇몇의
    윤곽
    다양한
    길이
    
  2. 소스 파일의 각 행을 길이로 바꿉니다.
    $ ( cat file.txt ); printf $ line | wc -c; 끝난
    4
    2
    1
    6
    4
    4
    7
    5
    2
    7
    6
    
  3. Sort and count the number of length occurrences:
    $ 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
    
  4. Swap and format the numbers:
    $ 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
    

If you allow for the columns to be swapped and don't need the headers, something as easy as

while read line; do echo -n $line | wc -m; done < file | sort | uniq -c

(without any advanced tricks with sed or awk) will work. The output is:

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

One important thing to keep in mind: wc -c counts the bytes, not the characters, and will not give the correct length for strings containing multibyte characters. Therefore the use of wc -m.

References:

man uniq(1)

man sort(1)

man wc(1)

참고URL : https://stackoverflow.com/questions/16750911/count-line-lengths-in-file-using-command-line-tools

반응형