추가의

추가의

3개의 열이 있는 TSV 탭으로 구분된 파일이 있습니다.

ID\tTEXT\tTYPE

TYPE내 칼럼 인쇄

cat /dataset.csv | awk -F $'\t' '{print $3}'

값은 같음과 같은 열거형입니다 {CLASS_A,CLASS_B,CLASS_C}.

NF열거형의 각 값을 일치시킬 때 열(?)의 발생 횟수를 계산하는 AWK의 인라인 방식을 사용하여 다음을 얻어야 합니다.TYPE

CLASS_A 1300
CLASS_B 450
CLASS_C 988

[고쳐 쓰다]

아래 솔루션을 기반으로 이 스크립트의 마지막 버전을 여기에 넣었습니다.

#!/bin/bash

COL=$1
FILE=$2

awk -v col="$COL" -F $'\t' '   {c[$col]++}
                 END{
                     for (i in c) printf("%s\t%s\n",i,c[i])
                 }' $FILE

열 3에서 행의 발생 횟수를 계산하는 사용법은 다음과 같습니다.

$ ./count_cols.sh 3 /myfile.csv

답변1

cat파일을 읽는 데 사용할 필요가 없습니다 . AWK는 완벽하게 읽을 수 있습니다.

핵심 c[$3]++문은 각 유형의 행 수를 가져와야 합니다.
그런 다음 마지막으로 모든 개수를 탭으로 구분된 값으로 인쇄합니다.

#!/bin/bash

awk -F '\t' '   {c[$3]++}
                 END{
                     for (i in c) printf("%s\t%s\n",i,c[i])
                 }' dataset.csv 

추가의

OP의 의견을 고려하면 다음과 같습니다.

따옴표가 있는 열에 몇 가지 문제가 있습니다. that doesn\'t mean that you\'re not worth remembering think of the people who need to know they need to know so you need ​to show....이 경우 \t에 대한 구문 분석이 실패합니다.

답변을 검토해야 합니다. 이 파일을 만들었습니다.

$ cat dataset.csv 
1233    that doesn\'t mean that you\'re not worth remembering think of the people who need to know they need to know so you need to show...    CLASS_0
1234    here    CLASS_A
1235    goes the values CLASS_B
1236    "that need counting"    CLASS_B
1237    "\like \this"   CLASS_B
1238    \or \this       CLASS_C
1239    including spaces        CLASS_B
1240    but not tabs    CLASS_A
1241    which could not work    CLASS_B
1242    finally CLASS_C
1243    this is CLASS_A
1244    over    CLASS_B
1245    988     CLASS_C

이 파일은 스크립트와 함께 사용할 때 올바른 결과를 제공합니다.

$ ./script
CLASS_A 3
CLASS_B 6
CLASS_C 3
CLASS_0 1

이것이 올바른 결과입니다.

물론 파일은

  1. tabs올바른 수의 3개 필드가 있고
  2. 확장 시 변수는 올바르게 인용되며 대문자로 표시되지 않습니다.

파일이 첫 번째 요구 사항을 충족하는지 테스트하려면 다음 스크립트를 사용할 수 있습니다.

#!/bin/bash

filetoread="$2"

<"$filetoread" tr -dc '\t\n' |
    awk '(length!=2){printf("Error in line: %s, has %s tabs\n",NR,length)}'

awk -F '\t' '(NF!=3){printf("Error in line: %s, has %s fields\n",NR,NF)}' "$filetoread"

한 줄에 두 개의 탭이 있는지 확인하고
필드 수(awk로 표시된 대로)가 실제로 3인지 확인합니다.

몇 줄의 테스트 줄을 추가합니다.

… …
1239    including spaces        CLASS_B
1       but not     tabs    CLASS_A
2       but not \ttabs  CLASS_A
1240    but not tabs    CLASS_A
… …

그리고 위의 스크립트를 실행하세요:

$ ./script 3 dataset.csv
Error in line: 8, has 4 tabs
Error in line: 8, has 5 fields

4개의 탭(2개가 추가됨)이 있는 행 ID 1이 감지되며 태그가 지정되지 않습니다 \t.

변수의 참조나 사용은 본인이 직접 개선해야 합니다.

답변2

다음과 같은 작업이 수행됩니다.

awk -F'\t' ' 
            $3=="CLASS_A" {a+=1} 
            $3=="CLASS_B" {b+=1} 
            $3=="CLASS_C" {c+=1} 
            END {
                printf "%s %d\n%s %d\n%s %d", CLASS_A,a,CLASS_B,b,CLASS_C,c
            }' /dataset.csv

답변3

3열에 "CLASS_A", "CLASS_B" 또는 "CLASS_C"가 포함될 수 있다는 점을 올바르게 이해하길 바랍니다.

그 다음에

awk -F'\t'  '
 { seen[$3]++ ;}
 END { for (i in seen) {
         printf "%s : %s\n",i,seen[i]
       }
      } 
 ' /dataset.csv

이 작업을 수행해야 합니까?

"for (i in saw)"는 "올바른 순서"로 읽힌다는 것을 보장하지 않지만, 하나를 추가하여 | sort(전체 awk 뒤에) 정렬하거나 더 복잡한 트릭을 사용할 수 있습니다(awk Inside에서).

첫 번째 줄도 건너뛰어야 하는 경우(예: 헤더가 포함된 경우)다음에 추가awk 스크립트의 첫 번째 줄 앞에:

( NR==1 ) { next ;}

또는 첫 번째 줄을 다음과 같이 변경합니다.

( NR > 1 ) { seen[$3]++ ;}

관련 정보