한 열의 모든 문자를 알파벳순으로 계산하는 방법

한 열의 모든 문자를 알파벳순으로 계산하는 방법

파일에서 "a"부터 "z"까지 열의 모든 문자를 어떻게 계산 .tsv하고 각 문자가 얼마나 자주 나타나는지 출력에서 ​​알 수 있나요?

예를 들어 이것이 열이라고 가정해 보겠습니다.

abc
abd
aabf

내가 원하는 출력은 다음과 같습니다.

4 a 
3 b
1 c
1 d
1 f

답변1

그리고 grep, sort그리고 uniq:

$ grep -o '[a-z]' file | sort | uniq -c
      4 a
      3 b
      1 c
      1 d
      1 f

다음을 사용하여 선행 공백을 제거할 수 있습니다 sed.

$ grep -o '[a-z]' file | sort | uniq -c | sed 's/^ *//'
4 a
3 b
1 c
1 d
1 f

cut일곱 번째 열만 필요한 경우 앞에 다음을 추가하세요.

cut -f7 file | grep -o '[a-z]' | sort | uniq -c | sed 's/^ *//'

답변2

만 사용기본 도구+ csvcut:

csvcut -c 7 file | tr -d '\n' | fold -w1 | sort | uniq -c

산출

  4 a
  3 b
  1 c
  1 d
  1 f

답변3

나열된 도구(cut, sed, sort, uniq)를 사용하고 셸을 제외한 다른 도구는 사용하지 마세요.

#!/bin/bash
column=$1
shift
cut -d'\t' -f$column  "$@" | 
    sed 's/[^a-z]//g;s/./&\n/g' | 
    grep . | sort | uniq -c

이를 사용하여 myprog 7 file1 file2file1 file2의 열 7을 가져옵니다.

답변4

단일 라인 구조(파이프라인 없음, 단 하나의 프로세스):

perl -0ane '
    map { $h{$_}++ } sort grep { /\w/ } split //, $F[6];
    print "$h{$_} $_\n" for sort keys %h
' file

나는 매우 간결하기 때문에 Perl을 좋아합니다.멋진체인 콜 세트.

그 뒤에 있는 아이디어는 HASH( $h)를 생성하고 각 문자를 반복하여 발생 횟수를 계산하는 것입니다.$h->{$_}++

인쇄 전 해시는 다음과 같습니다.

$VAR1 = {
          'a' => 4,
          'c' => 1,
          'f' => 1,
          'd' => 1,
          'b' => 3
        };

산출

4 a
3 b
1 c
1 d
1 f

관련 정보