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
이것이 올바른 결과입니다.
물론 파일은
tabs
올바른 수의 3개 필드가 있고- 확장 시 변수는 올바르게 인용되며 대문자로 표시되지 않습니다.
파일이 첫 번째 요구 사항을 충족하는지 테스트하려면 다음 스크립트를 사용할 수 있습니다.
#!/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]++ ;}